AS400やRPG言語等で利用されているEBCDICコード順ソートをJavaで実現する方法
某所でちょっと話題になったので、ASCIIのスーパーセットになっていない文字コードをソートする方法を紹介します
asciiでは文字は
- 数字->英語大文字、英語小文字
の順で並んでいますが、最近普通に使われている文字コードも大体はASCIIコードのスーパーセットになっており、 数字と英語は同じ並びになっています。(だから日本語以外は文字化けしなかったりするケースが多いわけですね〜)
asciiが登場するより前に出現した文字コードは*1この順番になっていなかったりします。
- 英語小文字->英語大文字->数字*2
ラムダ式の復習なども兼ねて、こちらをJavaでソートするコードを書きました。
import java.util.*; import java.nio.charset.*; public class Main { public static void main(String[] args) throws Exception { //データ用意 List<String> list = Arrays.asList("abcd","1234","ABCDEFG","Z","z"); //ソート Collections.sort(list,(a,b)->{ Charset encoding = Charset.forName("IBM1047"); return encoding.encode(a).compareTo(encoding.encode(b)); }); //EBCDICでソートしたものを表示 System.out.println(list); //表示結果[abcd, z, ABCDEFG, Z, 1234] //デフォルトのソート Collections.sort(list); System.out.println(list); //表示結果[1234, ABCDEFG, Z, abcd, z] } }