web-dev-qa-db-ja.com

Javaにカスタムコンパレータを使用してSortedMapを作成する

JavaにTreeMapをカスタムのソート順で作成したい。文字列であるソートされたキーは、2番目の文字に従ってソートする必要があります。値も文字列です。

サンプルマップ:

Za,FOO
Ab,Bar
21
unj2

次のようなカスタムコンパレータを使用できます。

    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ソリューションの方が読みやすくなっています。

以下も参照してください。

32

ハッシュ関数やソートのようにハッシュを意味しないと仮定すると...

これは、Stringの「ラッパー」クラスを作成し、compareToメソッドをオーバーライドすることで簡単に実現できます。

0
CheesePls