LoginSignup
7
4

More than 5 years have passed since last update.

ひらがなとアルファベットがまざったリストのソートをする

Last updated at Posted at 2016-05-20

たとえば
["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);
    }
});

てな感じで、わりと柔軟にいけそうです。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4