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

问题描述 投票:0回答:7

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

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()));

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

java java-8 java-stream
7个回答
128
投票

试试这个

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

30
投票

正如 @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");
}

17
投票

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

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

4
投票

这是多种方法之一:

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

1
投票

看起来有一个比较器通过compareToIgnoreCase对String对象进行排序,您可以在这里阅读文档:https://docs.oracle.com/javase/8/docs/api/java/lang/String.html# CASE_INSENSITIVE_ORDER


0
投票

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

它对我有用


-3
投票

您可以像这样小写或大写:

listofEmployees.stream()
               .sorted(Comparator.comparing((Employee e) -> e.getName()
                                 .toLowerCase()) // or toUpperCase
                                 .reversed())
               .forEach(s -> System.out.println(s.getName()));
© www.soinside.com 2019 - 2024. All rights reserved.