Сортировка строкового значения без учета регистра в Java 8

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

List<Employee> listofEmployees = Arrays.asList(
    new Employee(1, "aaa", Arrays.asList(123, 345, 678)),
    new Employee(1, "bbb", Arrays.asList(91011, 121314, 1516117)),
    new Employee(2, "ccc", Arrays.asList(181920, 212223, 242526)),
    new Employee(3, "ddd", Arrays.asList(272829, 303132, 333435)),
    new Employee(4, "BBB", Arrays.asList(29, 332, 33))
);

Я написал так:

listofEmployees.stream().sorted(Comparator.comparing(Employee::getName).reversed())
        .forEach(s -> System.out.println(s.getName()));

Как мне передать здесь параметр, нечувствительный к регистру?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
35
0
19 513
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Как @Tree предложил в комментариях, можно использовать java.text.Collator для нечувствительного к регистру и чувствительного к языку сравнения String. Ниже показано, как в американском английском можно игнорировать и регистр, и диакритические знаки:

Collator collator = Collator.getInstance(Locale.US);
collator.setStrength(Collator.PRIMARY);
listOfEmployees.sort(Comparator.comparing(Employee::getName, collator.reversed()));

Когда сила подборщика установлена ​​на PRIMARY, тогда только различия PRIMARY считаются значимыми при сравнении. Следовательно, следующие строки считаются эквивалентными:

if (collator.compare("abc", "ABC") == 0) {
    System.out.println("Strings are equivalent");
}
Ответ принят как подходящий

Попробуй это

Comparator.comparing(Employee::getName, String.CASE_INSENSITIVE_ORDER)

Осторожно: обратите внимание, что этот компаратор не принимает во внимание языковой стандарт, что приведет к неудовлетворительному упорядочиванию для определенных языков. Пакет java.text предоставляет средства сортировки, позволяющие упорядочивать файлы с учетом языковых стандартов.

TREE 13.04.2018 20:27

@TREE, как ты здесь будешь обрабатывать null-safe?

USM 13.04.2020 15:59

Обработка null, по-видимому, зависит от реализации в Collators. Так что единственный безопасный способ - обрабатывать их вне Collator.

TREE 13.04.2020 20:11

Вы можете строчные или прописные буквы вот так:

listofEmployees.stream()
               .sorted(Comparator.comparing((Employee e) -> e.getName()
                                 .toLowerCase()) // or toUpperCase
                                 .reversed())
               .forEach(s -> System.out.println(s.getName()));

Это один из многих способов:

listofEmployees.stream()
    .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()))
    .forEach(s -> System.out.println(s.getName()));

Похоже, что есть Comparator, который упорядочивает объекты String с помощью compareToIgnoreCase, вы можете прочитать документацию здесь: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#CASE_INSENSITIVE_ORDER

Вы можете указать его как второй аргумент, чтобы игнорировать регистры:

Comparator.comparing(Employee::getName, String::compareToIgnoreCase).reversed()

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

USM 13.04.2020 15:59

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