在Java 8中以不区分大小写的方式对字符串值进行排序

Lea*_*oop 21 java java-8 java-stream

如何在不区分大小写的顺序中对字符串值进行排序?

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))
);
Run Code Online (Sandbox Code Playgroud)

我写的是这样的:

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

如何在此处传递字符串不区分大小写的选项?

Had*_*i J 53

试试这个

Comparator.comparing(Employee::getName, String.CASE_INSENSITIVE_ORDER)
Run Code Online (Sandbox Code Playgroud)

  • 注意:请注意,此比较器不会考虑区域设置,并且会导致某些区域设置的排序不令人满意.java.text包提供Collat​​ors以允许区分区域敏感的排序. (19认同)
  • 可以通过“Comparator.nullsFirst”或“nullsLast”进行空处理:“Comparator.comparing(Employee::getName, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER))” (2认同)

Ole*_*hov 12

正如@Tree在评论中建议的那样,可以使用java.text.Collatorfor for case- inseitive 和locale-sensitive Stringcomparison.以下显示美国英语如何忽略大小写和重音:

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

当整理器强度设置为时PRIMARY,PRIMARY在比较期间仅差异被认为是显着的.因此,以下字符串被认为是等效的:

if (collator.compare("abc", "ABC") == 0) {
    System.out.println("Strings are equivalent");
}
Run Code Online (Sandbox Code Playgroud)


Sch*_*uca 7

您可以将其指定为忽略大小写的第二个参数:

Comparator.comparing(Employee::getName, String::compareToIgnoreCase).reversed()
Run Code Online (Sandbox Code Playgroud)

  • ```Comparator.comparing(Employee::getName, Comparator.nullsFirst(String::compareToIgnoreCase)));``` (3认同)