文字列のリストをアルファベット順に並べ替える必要があります。
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"
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);
この問題を解決する簡単な方法は、グアバの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"
単に使用する
Java.util.Collections.sort(list)
string.CASE_INSENSITIVE_ORDERコンパレータパラメータなし。
私は最近、同様の質問に答えました 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);
}
})
);