Сортируйте буквенно-цифровую строку, затем чередуйте числовой / алфавитный вывод символов - PullRequest
1 голос
/ 02 сентября 2010

Учитывая строку ввода (например, D4C3B2A1), я хочу отсортировать символы алфавита, а затем цифры (по возрастанию) чередовать их. Ожидаемый результат будет: A1B2C3D4

Я думал об этом, используя RegEx, чтобы вытащить две строки, только буквы, а затем только цифры.

Сортировка обеих строк, затем использование подстроки для извлечения каждой буквы одна за другой и присвоение ей новой строки. Однако, похоже, что это будет работать только при условии, что вы знаете значение / длину оригинальных строк и т. Д.

Кроме того, я подумал, что есть лучший способ сделать это для начала.

Предположим, это должно работать для введенной строки, а не только для предоставленной строки примера.

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

(непроверенная)

public static string Transform(string text)
{
  // Insert null-check here. You may also want to trim the string.

  var letters = text.Where(char.IsLetter).OrderBy(l => l).ToArray();
  var numbers = text.Where(char.IsNumber).OrderBy(n => n).ToArray();

  if (letters.Length != numbers.Length || (letters.Length + numbers.Length != text.Length))
       throw new FormatException("Text must consist only of an equal number of letters and numbers.");

  var zipped = letters.Zip(numbers, (l, n) => string.Concat(l, n));
  return string.Concat(zipped.ToArray());
}

Если вы используете .NET 3.5, вы можете заменить строку zip:

var zipped = Enumerable.Range(0, text.Length).Select(i => string.Concat(letters[i], numbers[i]));
2 голосов
/ 02 сентября 2010

Чтобы получить (отсортированные) строки букв и цифр, которые вам не нужны регулярные выражения, используйте Linq:

string s = "D4C3B2A1";

string letters = new String(s.Where(Char.IsLetter).OrderBy(c=>c).ToArray());
string numbers = new String(s.Where(Char.IsNumber).OrderBy(c=>c).ToArray());

Чтобы смешать два, вы можете использовать это:

public static string Mix(string s1, string s2)
{
    if (String.IsNullOrEmpty(s1))
        return s2;

    if (String.IsNullOrEmpty(s2))
        return s1;

    string s = String.Empty;

    for (int i=0; i<Math.Min(s1.Length, s2.Length); i++)
    {
        s += s1[i].ToString() + s2[i].ToString();
    }

    if (s1.Length > s2.Length)
        s += s1.Substring(s2.Length);
    else if (s2.Length > s1.Length)
        s += s2.Substring(s1.Length);

    return s;
}
0 голосов
/ 02 сентября 2010

Предположим, у вас одинаковое количество цифр и букв (я проверял это):

string s = "D4C1B2A3";

var s1 = s.Where(c => char.IsLetter(c)).OrderBy(c => c).ToArray();
var s2 = s.Where(c => char.IsDigit(c)).OrderBy(c => c).ToArray();

var sortedString = new string(s.Select((x, idx) => idx % 2 == 0 ? s1[idx / 2] : s2[(idx - 1) / 2]).ToArray());

Чтобы избежать "неправильного" использования s.Выберите последнюю строку с помощью:

var sortedString = new string(Enumerable.Range(0, s.Length).Select(idx => idx % 2 == 0 ? s1[idx / 2] : s2[(idx - 1) / 2]).ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...