JavaにTreeMap
をカスタムのソート順で作成したい。文字列であるソートされたキーは、2番目の文字に従ってソートする必要があります。値も文字列です。
サンプルマップ:
Za,FOO
Ab,Bar
次のようなカスタムコンパレータを使用できます。
Comparator<String> secondCharComparator = new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return s1.substring(1, 2).compareTo(s2.substring(1, 2));
}
};
サンプル:
SortedMap<String,String> map =
new TreeMap<String,String>(secondCharComparator);
map.put("Za", "FOO");
map.put("Ab", "BAR");
map.put("00", "ZERO");
System.out.println(map); // prints "{00=ZERO, Za=FOO, Ab=BAR}"
これは、String
がインデックス1に文字を持っていると単純に想定していることに注意してください。ない場合は、StringIndexOutOfBoundsException
をスローします。
または、この比較を使用することもできます。
return s1.charAt(1) - s2.charAt(1);
この「トリック」の減算は一般的に破られますが、2つのchar
の減算はint
をオーバーフローしないため、ここではうまく機能します。
ただし、上記のsubstring
およびcompareTo
ソリューションの方が読みやすくなっています。
ハッシュ関数やソートのようにハッシュを意味しないと仮定すると...
これは、Stringの「ラッパー」クラスを作成し、compareToメソッドをオーバーライドすることで簡単に実現できます。