web-dev-qa-db-ja.com

(大文字と小文字を区別する)アルファベット順で文字列を並べ替える簡単な方法

文字列のリストをアルファベット順に並べ替える必要があります。

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"
40
Michael

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);
68
Stephen C

この問題を解決する簡単な方法は、グアバのComparisonChainを使用することです 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);

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

"AA","Aa","aa","Development","development"
16
Michael

単に使用する

Java.util.Collections.sort(list)

string.CASE_INSENSITIVE_ORDERコンパレータパラメータなし。

1
L. G.

私は最近、同様の質問に答えました here 。同じアプローチを問題に適用すると、次の解決策が得られます。

list.sort(
  p2Ord(stringOrd, stringOrd).comap(new F<String, P2<String, String>>() {
    public P2<String, String> f(String s) {
      return p(s.toLowerCase(), s);
    }
  })
);
1
missingfaktor