列排序不会忽略大写字母

Rob*_*ert 1 java arrays sorting collections

我有这样的清单:

ArrayList<String> al = new ArrayList<String>();
al.add("James Smith");
al.add("MARIA GARCIA");
al.add("Maria Garcia");
al.add("DAVID SMITH");
Run Code Online (Sandbox Code Playgroud)

我使用了集合排序并忽略了大写字母。

Collections.sort(al, String.CASE_INSENSITIVE_ORDER); 
Run Code Online (Sandbox Code Playgroud)

它适用于所有人,但因为MARIA GARCIA它仍然保留在小写字母之前Maria Garcia。有什么办法可以改变它吗?

wes*_*ton 5

如果两个项目相等,则它们的顺序不会改变*。

通过使用忽略大小写的比较器,这些字符串是相等的。

如果你想在两个项目相等时应用不同的排序,你可以thenComparing像这样扩展比较器:

Collections.sort(al, String.CASE_INSENSITIVE_ORDER
                           .thenComparing(
                               Comparator.comparing(String::toString)
                                         .reversed())); 
Run Code Online (Sandbox Code Playgroud)

在这种情况下可以更简单地写成:

Collections.sort(al, String.CASE_INSENSITIVE_ORDER
                           .thenComparing(Comparator.reverseOrder())); 
Run Code Online (Sandbox Code Playgroud)

*这就是为什么另一个答案有效,但你不想多次排序,它效率低下,读者更难理解,因为它是向后写的,并且不是一种你可以在所有其他情况下重用的模式。

  • 请注意,从 Java 8 开始,您可以简单地在“List”实例上调用“sort”。此外,您可以使用古老的(如果不是说古老的)“Collat​​or.getInstance()”,而不是“String.CASE_INSENSITIVE_ORDER .thenComparing(Comparator.reverseOrder())”。简而言之,`al.sort(Collat​​or.getInstance());` (2认同)