値によるツリーマップの並べ替え
ツリーマップは、キーが自然な順序に従って昇順に並べ替えられた並べ替えられたマップです。値に基づいてカスタマイズされた並べ替えが必要な場合は、代わりに値を評価するコンパレーターを使用する必要があります。
そのようなコンパレーターを実装する試みの 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 サイトの他の関連記事を参照してください。