列排序不会忽略大写字母
我有这样的清单:
ArrayList<String> al = new ArrayList<String>();
al.add("James Smith");
al.add("MARIA GARCIA");
al.add("Maria Garcia");
al.add("DAVID SMITH");
我使用了集合排序并忽略了大写字母。
Collections.sort(al, String.CASE_INSENSITIVE_ORDER);
它适用于所有人,但因为MARIA GARCIA它仍然保留在小写字母之前Maria Garcia。有什么办法可以改变它吗?
回答
如果两个项目相等,则它们的顺序不会改变*。
通过使用忽略大小写的比较器,这些字符串是相等的。
如果你想在两个项目相等时应用不同的排序,你可以thenComparing像这样扩展比较器:
Collections.sort(al, String.CASE_INSENSITIVE_ORDER
.thenComparing(
Comparator.comparing(String::toString)
.reversed()));
在这种情况下可以更简单地写成:
Collections.sort(al, String.CASE_INSENSITIVE_ORDER
.thenComparing(Comparator.reverseOrder()));
*这就是为什么另一个答案有效,但你不想多次排序,它效率低下,读者更难理解,因为它是向后写的,并且不是一种你可以在所有其他情况下重用的模式。
- Note that since Java 8, you can simply invoke `sort` on the `List` instance. Further, instead of `String.CASE_INSENSITIVE_ORDER .thenComparing(Comparator.reverseOrder())` you can use the good old (if not to say ancient) `Collator.getInstance()`. So in short, `al.sort(Collator.getInstance());`