LoginSignup
8
10

More than 5 years have passed since last update.

Javaの日本語(漢字)ソート

Last updated at Posted at 2017-01-14

自分の担当箇所ではなかったが、過去にプログラムの移植案件(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

別プラットフォームの日本語ソートを再現するのは大変そうだ

書籍など

検索中によく引用されていた書籍(自分用メモ)

プログラマのための文字コード技術入門
Java国際化プログラミング

8
10
4

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
8
10