Сортировка цифр в строке по алфавиту - PullRequest
1 голос
/ 20 февраля 2010

У нас есть список заголовков, некоторые из которых начинаются с цифр (например, 5 способов создания виджетов). Мы хотели бы отсортировать это, как если бы это было «Пять способов ...» без изменения названия. Мы знаем, что некоторые кинотеатры делают это, но я не могу найти информацию в Интернете о том, как это сделать. Есть идеи?

Ответы [ 4 ]

3 голосов
/ 20 февраля 2010

Сохраните как оригинальное название, так и прописанное название.

select OriginalTitle from Movies order by spelledTitle

См. Также: Преобразование целых чисел в записанные числа

1 голос
/ 20 февраля 2010

Создание пользовательского компаратора см. http://support.microsoft.com/kb/320727.

По сути, вы хотите проверить, является ли первый символ цифрой. Если это не просто возврат к стандартному сравнению строк, если это так, вы можете выполнить дополнительную обработку, чтобы получить текстовую версию числа.

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

1 голос
/ 20 февраля 2010

В области компьютерных наук при изучении программирования иногда есть задание для преобразования чисел в текст. Как:

526 = Fivehundredtwentysix

Это, вероятно, то, что вам нужно в этом случае.

Это тривиальное задание, но это хороший урок.

0 голосов
/ 20 февраля 2010

Чтобы расширить предложения других людей:

  1. Самой сложной частью этого является, вероятно, код, который преобразует число в английскую строку, представляющую это число, - назначение Сани для программирования. Я включил упрощенный пример, который может не соответствовать вашим требованиям.
private static string[] digitnames = new string[] 
    { "oh", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
private static string ReplaceDigits(string s)
{
    string convertedSoFar = ""; //could use a StringBuilder if performance is an issue.
    for (int charPos = 0; charPos < s.Length; charPos++)
    {
        if (char.IsNumber(s[charPos]))
        {
            //Add the digit name matching the digit.
            convertedSoFar += digitnames[int.Parse(s[charPos].ToString())];
        }
        else
        {
            //we've reached the end of the numbers at the front of the string. 
            //Add back the rest of s and quit.
            convertedSoFar += s.Substring(charPos);
            break;
        }
    }
    return convertedSoFar;
}

Этот код превращает «101 далматин» в «однонаправленный далматин», а «12 злых людей» в «двух злых людей» Может быть построено более полное решение, возможно, из решения Клинга немного другой проблемы . Я не тестировал этот код, и он не предназначен для обработки строки после цифр, но, вероятно, это хорошее начало.

  1. В современном C # (я думаю, 3.0 и выше) вы можете передать имя метода в Sort, а не явно создавать IComparable или IComparer. По сути, это та же идея, что и ссылка Майкла. Другой связанный параметр - это анонимное лямбда-выражение , которое даже не требует внешнего метода. Лично я думаю, что код читается более чисто таким образом.
private static int NumberReplacingCompare(string strA, string strB)
{
    return ReplaceDigits(strA).CompareTo(ReplaceDigits(strB));
}
private static void OutputSortedStrings()
{
    List strings = new List(File.ReadAllLines(@"D:\Working\MyStrings.txt")); //pull the strings from a file (or wherever they come from
    strings.Sort(NumberReplacingCompare); //sort, using NumberReplacingCompare as the comparison function
    foreach (string s in strings)
    {
        System.Console.WriteLine(s);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...