Как отсортировать строковые значения в следующем порядке без учета регистра?
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()));
Как мне передать здесь параметр, нечувствительный к регистру?




Как @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)
@TREE, как ты здесь будешь обрабатывать null-safe?
Обработка null, по-видимому, зависит от реализации в Collators. Так что единственный безопасный способ - обрабатывать их вне Collator.
Вы можете строчные или прописные буквы вот так:
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()
Как вы здесь справитесь с нулевым безопасностью?
Осторожно: обратите внимание, что этот компаратор не принимает во внимание языковой стандарт, что приведет к неудовлетворительному упорядочиванию для определенных языков. Пакет java.text предоставляет средства сортировки, позволяющие упорядочивать файлы с учетом языковых стандартов.