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

「AA」が「aa」に等しい CaseInsensitiveComparator の問題。文字列は、同じ値を追加する順序に従って結果に表示されますが、正しくありません。

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

4 に答える 4

78

Guavaへの依存関係を追加したくない場合(Michaelの回答による)、このコンパレータは同等です。

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の ComparisonChain を使用することです。

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

チェーンの最初のコンパレータは、大文字と小文字を区別しない順序に従って文字列を並べ替え、2 番目のコンパレータは、大文字と小文字を区別しない順序に従って文字列を並べ替えます。除外された文字列は、アルファベット順に結果に表示されます。

"AA","Aa","aa","Development","development"
于 2012-06-24T09:07:49.090 に答える
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 に答える