[Java Tips]文字列をEUCコード順でソートする
他のシステムと連携するため、Javaで文字列をUnicode順ではなくEUC-JPコード順でソートする、という必要があったので作ってみました。import java.nio.*;import java.nio.charset.*;import java.text.*;import java.util.*;/** * EUC-JP順で文字列をソートするテストクラス。 * (Linuxのsortコマンドと同じ並びになるか) * JDK1.4以上で動作可能。 */public class EucSorter { private static final Comparator comp = new ByteComparator(); /** * 引数の配列内の文字列をEUC-JP順に並び替えて返します。 * * @param strs ソート対象文字列配列 * @return ソートされた文字列配列 * @throws CharacterCodingException 文字のエンコードエラーが発生した場合 */ public static String[] sort(String[] strs) throws CharacterCodingException { Map map = new TreeMap(comp); for (int i=0; i<strs.length; i++) { String str = strs[i]; CharsetEncoder eucEncoder = Charset.forName("EUC-JP").newEncoder(); ByteBuffer eucBuffer = eucEncoder.encode(CharBuffer.wrap(str.toCharArray())); eucBuffer = eucBuffer.order(ByteOrder.nativeOrder()); map.put(eucBuffer, str); } Collection coll = map.values(); return (String[])coll.toArray(new String[coll.size()]); } /** * EUC-JP順での文字列順序付けを行う為のComparator実装クラスです。 */ private static final class ByteComparator implements Comparator { /** * ほかのオブジェクトがこのコンパレータと等しいかどうかを示します。 * * @param obj 比較対象の参照オブジェクト * @return 指定されたオブジェクトもコンパレータであり、 * それがこのコンパレータと同じ順序付けを行う場合にだけ true */ public boolean equals(Object obj) { return (super.equals(obj)); } /** * EUC-JP順での文字列順序付けのために2つの引数を比較します。 * * @param obj1 比較対象バイトバッファ * @param obj2 比較対象バイトバッファ * @return obj1の方が多ければ負, 少なければ正, 同じなら0 * @throws ClassCastException 引数の型がByteBufferで無い場合 */ public int compare(Object obj1, Object obj2) { ByteBuffer buffer1 = (ByteBuffer)obj1; ByteBuffer buffer2 = (ByteBuffer)obj2; int n = buffer1.position() + Math.min(buffer1.remaining(), buffer2.remaining()); for (int i = buffer1.position(), j = buffer2.position(); i < n; i++, j++) { int v1 = (int)(buffer1.get(i) & 0xFF); int v2 = (int)(buffer2.get(j) & 0xFF); if (v1 == v2) { continue; } if (v1 < v2) { return -1; } return +1; } return buffer1.remaining() - buffer2.remaining(); } }}とりあえずこんな感じで動いてるっぽいです。もっといけてるやり方があったら教えてください。