Collatorを使うと単純な文字コード順ではなく、ある程度、読み(基本的には音読み?)を意識した順番でソートしてくれる。
// あ、い、う、え、おで始まる文字をListに入れる
String[] strArray1 = { "阿吽", "以下", "宇宙", "縁側", "尾ひれ" };
List list = Arrays.asList( strArray1 );
// 通常のCollections.sortを使用した場合
// 読みなどは関係なく、単純なUnicode上のコード順になる
Collections.sort( list );
System.out.println( list );
//=> [以下, 宇宙, 尾ひれ, 縁側, 阿吽]
// Collatorを使用した場合
// アイウエオ順にソートされている
Collator collator = Collator.getInstance( Locale.JAPANESE );
Collections.sort( list, collator );
System.out.println( list );
//=> [阿吽, 以下, 宇宙, 縁側, 尾ひれ]
平仮名、片仮名を変換する場合も読みを意識したソート順になる。
// 平仮名や片仮名を変換するとどうなるだろう
String[] strArray2 = { "ぁ", "あ", "か", "が", "カ", "さ", "ざ" };
list = Arrays.asList( strArray2 );
// 通常のCollections.sortを使用した場合
Collections.sort( list );
System.out.println( list );
//=> [ぁ, あ, か, が, さ, ざ, カ]
// Collatorを使用した場合
// 小文字の「ぁ」は「あ」より後に来る
// 平仮名の「か」、片仮名の「カ」、平仮名の「が」、平仮名の「さ」の順になる
Collator collator = Collator.getInstance( Locale.JAPANESE );
Collections.sort( list, collator );
System.out.println( list );
//=> [あ, ぁ, か, カ, が, さ, ざ]
Collatorを使用するとソートルールが複雑になるので、実行時間はかなり伸びる。
試しにListに要素を1万個詰めて実行した場合の実行時間は、およそ26倍になっていた。
5,974,443ナノ秒
129,861,886ナノ秒
家庭用PCで1万をソートしてこの速度なので、数百とか数千の要素数なら十分に実用可能かと。
漢字は1つの文字で複数の音読みを持っているので、必ずしも自分が思ったようにソートされるとは限らないけど、単純な文字コード順よりマシで実装の手間もないという点を考えると、知っておいて損はない機能だと思った。