Как вы будете сортировать строки в следующем примере?
Так что у меня есть список строк
{Испытание, 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, если входные данные имеют тенденцию к значительному росту.