Метод сортировки коллекций Java для строки не работает должным образом для чувствительных к регистру и специальных символов - PullRequest
22 голосов
/ 18 марта 2019

Я работал над сортировкой списка строк в 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]

Нужно ли использовать для этого что-то еще, кроме естественного вида?

Ответы [ 2 ]

31 голосов
/ 18 марта 2019

Вы можете использовать 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]
3 голосов
/ 18 марта 2019

Вы можете создать собственный компаратор для своей логики сортировки.После этого вы можете использовать его так:

Collections.sort(yourArrayList, new YourComparator());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...