Как вы будете сортировать строки в следующем примере? - PullRequest
0 голосов
/ 19 марта 2010

, поэтому у меня есть список строк
{Испытание, testertest, тестирование, тестер, testingtest}
Я хочу отсортировать его в порядке убывания .. как вообще сортировать строки? Это основано на длине или это символ за символом ??
как бы это было в примере выше ?? Я хочу отсортировать их по убыванию.

Ответы [ 7 ]

2 голосов
/ 19 марта 2010

Независимо от того, на каком языке вы находитесь, есть встроенная функция sort, которая выполняет лексикографический порядок , который возвращает

['test','tester','testertest','testing','testingtest']

для вашего примера.Если бы я хотел, чтобы все было наоборот, я бы просто сказал reversed(sorted(myList)) на Python и покончил с этим.Если вы посмотрите направо, вы увидите множество связанных вопросов, которые требуют более специализированного метода заказа (для чисел, дат и т. Д.), Но лексикографический порядок работает со строками, содержащими данные любого типа.

Вот какэто работает:

compare(string A, string B):
    if A and B are both non-empty:
        if A[0] == B[0]:
            // First letters are the same; compare by the rest
            return compare(A[1:], B[1:])
        else:
            // Compare the first letters by Unicode code point
            return compare(A[0], B[0])
    else:
        // They were equal till now; the shorter one shall be sorted first 
        return compare(length of A, length of B)
2 голосов
/ 19 марта 2010

Я бы отсортировал это так:

тестирование
тестирование
тестер
тестер
тест

1 голос
/ 19 марта 2010

В информатике строки обычно сортируются посимвольно, предпочтительный порядок сортировки (для стандартного набора английских символов):

  • Сначала нулевые символы
  • Вслед за whitepsace
  • С последующими символами
  • За которыми следуют числовые символы в явном числовом порядке
  • Вслед за буквенными символами в явном алфавитном порядке

При сортировке символов обычно строчные буквы располагаются перед прописными.

Так, например, если бы мы сортировали / сравнивали:

тест я нг
тест e r

Тогда «тестер» будет стоять перед «тестированием» - первым другим символом в строке будет 5-й, а «е» стоит перед «i».

Аналогично, если сравнивать:

тест
Тестирование

Тогда в этом случае «test» будет первым - снова строки будут идентичны до 5-го символа, где заканчивается строка «test» (т. Е. Без символа), которая становится перед любым буквенно-цифровым символом.

Обратите внимание, что это может привести к некоторым нелогичным результатам при работе с числами - например, попробуйте отсортировать строки "50" и "100" - вы обнаружите, что "100" приходит до"50" , Зачем? потому что строки отличаются в символе 1 и «5» следует после «1».

Почти во всех языках есть функция, которая сделает все вышеперечисленное для вас!

Вы должны использовать эту функцию вместо того, чтобы пытаться сортировать строки самостоятельно! Например:

// C#
string[] myStrings = {"test","testertest","testing","tester","testingtest"};
Array.Sort(myStrings);
1 голос
/ 19 марта 2010

Предполагая C #

string[] myStrings = {"test","testertest","testing","tester","testingtest"};
Array.Sort(myStrings);
Array.Reverse(myStrings);
foreach(string s in myStrings)
{
     Console.WriteLine(s);
}

Не всегда идеальный способ сделать это - вместо этого вы можете реализовать собственный компаратор - но для тривиального примера, который вы спросили об этом, вероятно, самый логичный подход.

0 голосов
/ 19 марта 2010

Хотите знать, должен ли test появляться после tester в порядке убывания? Или вас особенно интересует сортировка строк с похожими префиксами?

Если это позже, я бы предложил Trie , если входные данные стремительно растут.

0 голосов
/ 19 марта 2010

При сравнении двух строк, чтобы увидеть, какие сортировки в первую очередь, сравнение обычно выполняется на символьной основе.Если символы в первой позиции (например, t в вашем примере) идентичны, вы переходите к следующему символу.Когда два символа отличаются, это «может» определить, какая строка считается «большей».

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

Когда две строки идентичны, но одна длиннее, более длинная обычно считается «большей».При сортировке по убыванию сначала сортируется «больше» из двух строк.

0 голосов
/ 19 марта 2010

в Java вы можете использовать естественное упорядочение с

java.util.Collections.sort(list);

, чтобы сделать его по убыванию

java.util.Collections.reverse(list);

или создать свой собственный Comparator для обратной сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...