#java #sorting #collections
#java #сортировка #Коллекции
Вопрос:
Я работал над сортировкой списка строк в Java (1.8) и узнал, что он работает не так, как ожидалось!
Я пытаюсь использовать следующий код для сортировки:
private Set<String> getTestData() {
Set<String> compRoles = new HashSet<>();
compRoles.add("AA");
compRoles.add("Aa");
compRoles.add("aA");
compRoles.add("aa");
compRoles.add("11");
compRoles.add("117");
compRoles.add("12");
compRoles.add("21");
compRoles.add("!@");
compRoles.add("@!");
compRoles.add("@@!");
compRoles.add("BB");
compRoles.add("Bb");
compRoles.add("bb");
return compRoles;
}
public static void main(String args[]) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
Collections.sort(test);
System.out.println(test);
}
Перед сортировкой: [AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
После сортировки: [!@, 11, 117, 12, 21, @!, @@!, AA, Aa, BB, Bb, aA, aa, bb]
Я ожидаю, что: [!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]
Нужно ли мне использовать для этого что-то другое, кроме естественной сортировки?
Комментарии:
1. итак, для вас ‘a’ стоит перед ‘A’ .. ok. что ж, вам нужно будет написать свою собственную логику сортировки, но она будет довольно широкой. на самом деле вам придется сравнивать символ за символом. удачи.
2. Ответ содержится в вопросе. Учитывая, что естественный порядок упорядочивает элементы не так, как вам хотелось бы, вам нужно что-то еще.
3. Это уже реализовано в jQuery sort. datatables.net/examples/styling/bootstrap4 Но я не понимаю, какой алгоритм они используют! Из-за этого пользовательский интерфейс и серверная часть не синхронизированы. Есть идеи по этому поводу?
4. Юникод из ! меньше, чем у @ , unicode из @ меньше, чем 1, unicode из 1 меньше, чем A, uncicode из A меньше, чем a. Надеюсь, что это отвечает за результат, который вы получаете. Теперь, если вам нужна сортировка в соответствии с вашим порядком, внедрите свой компаратор.
5. @nits.kk: Я полностью согласен с ответом, данным jaspreet. Мы можем решить эту проблему с помощью docs.oracle.com/javase/7/docs/api/java/text/Collator.html
Ответ №1:
Вы можете использовать класс Collator Java.
public static void main(String[] args) {
List<String> test = new ArrayList<>(new Test().getTestData());
System.out.println(test);
test.sort(Collator.getInstance(Locale.ENGLISH));
System.out.println(test);
}
Вывод:-
[AA, Aa, aA, aa, 11, BB, Bb, bb, 12, @!, @@!, 117, 21, !@]
[!@, @!, @@!, 11, 117, 12, 21, aa, aA, Aa, AA, bb, Bb, BB]
Комментарии:
1. В наши дни у
List
класса есть свой собственныйsort
метод, поэтому выполнение является ненужным шагом. Немного понятнее написать код следующим образом:list.sort(Collator.getInstance(Locale.ENGLISH));
.2. Спасибо @Lii . Обновлен ответ. Я не читал, что он работал в Java 8, поэтому ответил Collections. сортировка вместо list.sort
3. Не всегда ясно, на какую версию Java ориентироваться в наших ответах. Но Java 8 отсутствует уже почти 5 лет! Я думаю, мы можем с уверенностью предположить, что это стандарт. В наши дни вы даже можете объявить свой список следующим образом:
var test = new ArrayList<>(new Test().getTestData());
Ответ №2:
Вы могли бы создать пользовательский компаратор для вашей логики сортировки. После этого вы можете использовать его следующим образом:
Collections.sort(yourArrayList, new YourComparator());
Комментарии:
1. Соответствующий ваш ответ. Я знаю, как использовать comparator и comparable. Я ищу логику или алгоритм, используемые за этим.
2. Тогда ваш вопрос должен выглядеть так, как будто вам нужен пользовательский компаратор, и должен содержать вопрос об алгоритмах сортировки. Самый простой способ — иметь веса для каждой буквы и сравнивать их по-своему.