ホームページ > Java > &#&チュートリアル > ツリーマップをキーではなく値で並べ替えるにはどうすればよいですか?

ツリーマップをキーではなく値で並べ替えるにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-23 05:59:23
オリジナル
146 人が閲覧しました

How Can I Sort a TreeMap by its Values, Not Keys?

値によるツリーマップの並べ替え

ツリーマップは、キーが自然な順序に従って昇順に並べ替えられた並べ替えられたマップです。値に基づいてカスタマイズされた並べ替えが必要な場合は、代わりに値を評価するコンパレーターを使用する必要があります。

そのようなコンパレーターを実装する試みの 1 つは次のようになります。

class byValue implements Comparator<Map.Entry<String, Integer>> {
    public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
        if (e1.getValue() < e2.getValue()) {
            return 1;
        } else if (e1.getValue() == e2.getValue()) {
            return 0;
        } else {
            return -1;
        }
    }
}
ログイン後にコピー

ただし、TreeMap は値のみに基づいて並べ替えることができないため、このアプローチには欠陥があります。これは、キーに関連付けられた値ではなく、キーを並べ替えるように設計されています。

代替解決策: Map.Entry の並べ替え

この制限を克服するには、外部コレクションを次のようにします。 Map.entrySet() コレクションをソートするために使用されます。このソートされたセットにより、値に基づいてフィルタリングと並べ替えが可能になります。 Map.entrySet() を値で並べ替える一般的なメソッドを次に示します。

static <K, V extends Comparable<? super V>>
SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) {
    SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>(
        new Comparator<Map.Entry<K, V>>() {
            @Override
            public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) {
                int res = e1.getValue().compareTo(e2.getValue());
                return res != 0 ? res : 1;
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}
ログイン後にコピー

このメソッドを使用すると、次に示すように、値に基づいて並べ替えられた Map.Entries のセットを取得できます。

Map<String, Integer> map = new TreeMap<>();
map.put("A", 3);
map.put("B", 2);
map.put("C", 1);   

System.out.println(map); // prints "{A=3, B=2, C=1}"
System.out.println(entriesSortedByValues(map)); // prints "[C=1, B=2, A=3]"
ログイン後にコピー

整数の等価性に関する注意

価値があります提供されたコードでは == を使用して整数値を比較していることに注意してください。これは、値の同一性ではなく参照の同一性をチェックするため、通常は推奨されません。一部のシナリオでは、予期しない結果が生じる可能性があります。値の比較には代わりに、compareTo() などのメソッドを使用することをお勧めします。

以上がツリーマップをキーではなく値で並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート