46

我需要按字母顺序对字符串列表进行排序:

List<String> list = new ArrayList();
list.add("development");
list.add("Development");
list.add("aa");
list.add("AA");
list.add("Aa");

一种常见的方法是使用比较器:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

CaseInsensitiveComparator 的问题是“AA”等于“aa”。字符串按照相同值的相加顺序出现在结果中,不正确:

"aa","AA","Aa","development","Development"
4

4 回答 4

78

如果您不想添加对 Guava 的依赖项(根据迈克尔的回答),那么这个比较器是等效的:

private static Comparator<String> ALPHABETICAL_ORDER = new Comparator<String>() {
    public int compare(String str1, String str2) {
        int res = String.CASE_INSENSITIVE_ORDER.compare(str1, str2);
        if (res == 0) {
            res = str1.compareTo(str2);
        }
        return res;
    }
};

Collections.sort(list, ALPHABETICAL_ORDER);

而且我认为它很容易理解和编码......

该方法的最后 4 行可以更简洁地写成如下:

        return (res != 0) ? res : str1.compareTo(str2);
于 2012-06-24T09:40:35.593 回答
16

解决问题的简单方法是使用来自 Guava http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ComparisonChain.html的比较链

private static Comparator<String> stringAlphabeticalComparator = new Comparator<String>() {
        public int compare(String str1, String str2) {
            return ComparisonChain.start().
                                compare(str1,str2, String.CASE_INSENSITIVE_ORDER).
                                compare(str1,str2).
                                result();
         }
 };
Collections.sort(list, stringAlphabeticalComparator);

链中的第一个比较器将根据不区分大小写的顺序对字符串进行排序,第二个比较器将根据不区分大小写的顺序对字符串进行排序。由于例外字符串按照字母顺序出现在结果中:

"AA","Aa","aa","Development","development"
于 2012-06-24T09:07:49.090 回答
2

只需使用

java.util.Collections.sort(list)

没有 String.CASE_INSENSITIVE_ORDER 比较器参数。

于 2013-10-01T11:59:18.867 回答
1

我最近在这里回答了一个类似的问题。对您的问题应用相同的方法将产生以下解决方案:

list.sort(
  p2Ord(stringOrd, stringOrd).comap(new F<String, P2<String, String>>() {
    public P2<String, String> f(String s) {
      return p(s.toLowerCase(), s);
    }
  })
);
于 2012-06-24T10:54:03.600 回答