自分の担当箇所ではなかったが、過去にプログラムの移植案件(COBOL -> Java)で、プラットフォーム依存の特殊なソートが再現できなくて困ったことがある。
その時の名残で文字のソートについて調べたら
Collectionのソート周りを調べていたら興味深い記事を読んだ。
漢数字が数字順にソートされない理由を調べてみた - give IT a try
Javaというか普通のシステムは漢数字のソートを提供していないようだ。
String[] KanjiNumbers = {"一","二","三","四","五","六","七","八","九"};
List<String> stringList = Arrays.asList(KanjiNumbers);
Collections.sort(stringList);//ソート
System.out.println(stringList);//表示
[一, 七, 三, 九, 二, 五, 八, 六, 四]
Collections#sort()を使った場合、1,7,3...と並んでしまう。
調べた結果、デフォルトではUnicodeの順番に並ぶらしい
数字 | UTF16 |
---|---|
一 | feff4e00 |
七 | feff4e03 |
三 | feff4e09 |
九 | feff4e5d |
二 | feff4e8c |
五 | feff4e94 |
八 | feff516b |
六 | feff516d |
十 | feff5341 |
四 | feff56db |
CollatorクラスというロケールごとにComparatorを用意できるクラスを使用してみる
Collator (Java Platform SE 8 )
こちらで日本語用のソートを用意したら、漢字が音読み順になった。
Collator collator = Collator.getInstance(Locale.JAPAN);
Collections.sort(stringList,collator);
System.out.println(stringList);
[一, 九, 五, 三, 四, 七, 二, 八, 六]
確証はないがこのルールで並んでいると思う
日本語文字列照合順番
数字 | 音読み |
---|---|
一 | いち |
九 | きゅう |
五 | ご |
三 | さん |
四 | し |
七 | なな |
二 | に |
八 | やつ? |
六 | ろく |
冒頭の記事によればshift_jisはこの順に並んでいるらしい
関連
日本語だけエクセルのソートとJavaのソート順違ってて
苦戦したみたいな話。
http://stackoverflow.com/questions/20612110/sort-japanese-data-in-java
別プラットフォームの日本語ソートを再現するのは大変そうだ
書籍など
検索中によく引用されていた書籍(自分用メモ)