Как вы будете сортировать строки в следующем примере?

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

7 ответов

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

testingtest
тестирование
testertest
тестер
тестовое задание

Неважно, на каком языке вы находитесь, есть встроенный 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)

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

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

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

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

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

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

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

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

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

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

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

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

// C#
string[] myStrings = {"test","testertest","testing","tester","testingtest"};
Array.Sort(myStrings);

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

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

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

В Java вы можете использовать естественный порядок с

java.util.Collections.sort(list);

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

java.util.Collections.reverse(list);

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

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

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

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

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

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

Другие вопросы по тегам