たとえば
["a", "あ", "b", "い", "c", "位", "d", "う", "a", "亜"]
のようなリストがあったとして、
これまでは普通に下記のようにComparatorインターフェースにお任せしていたんですが、
comparator
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String data1, String data2) {
return data1.compareTo(data2);
}
});
-> [a, a, b, c, d, あ, い, う, 亜, 位]
上記の通り、先にアルファベットが並びます。
先にひらがなを持ってくるやりかたがわからなかったので、調べたところ、Collatorクラスというものがあるようだったので、試しに使ってみると、意図した通りに並んでくれました。
Collator
Collator collator = Collator.getInstance(Locale.JAPANESE);
Collections.sort(data, collator);
-> [あ, い, う, 亜, 位, a, a, b, c, d]
CollatorクラスはComparatorインターフェースを実装しており、特定のロケールに依存してStringの比較を行います。ちなみに、ロケールを中国語にすると
Collator
Collator collator = Collator.getInstance(Locale.CHINESE);
Collections.sort(data, collator);
-> [位, 亜, a, a, b, c, d, あ, い, う]
こんな感じでした。中国語なので、日本人が考える音読み通りには並ばないですね。そりゃそうか。
Collatorの比較
Collator myCollatorJP = Collator.getInstance(Locale.JAPANESE);
myCollatorJP.compare("あ", "a"); // -1
Collator myCollatorEN = Collator.getInstance(Locale.ENGLISH);
myCollatorEN.compare("あ", "a"); // 1
Collator myCollatorCH = Collator.getInstance(Locale.CHINESE);
myCollatorCH.compare("あ", "a"); // 1
##2016/05/30追記
今度はロケールを指定しつつ、単なるStringの配列の比較ではなく、自分で定義したデータ型のプロパティ同士で比較する必要が出てきました。
Collatorしてプロパティで比較
Collator myCollatorJP = Collator.getInstance(Locale.JAPANESE);
Collections.sort(data, new Comparator<MyData>() {
@Override
public int compare(MyData data1, MyData data2) {
return collator.compare(data1.name,data2.name);
}
});
てな感じで、わりと柔軟にいけそうです。