Sortieren einer TreeMap nach Wert
Eine TreeMap ist eine sortierte Karte, in der die Schlüssel in aufsteigender Reihenfolge nach ihrer natürlichen Reihenfolge sortiert sind. Wenn eine benutzerdefinierte Sortierung basierend auf den Werten erforderlich ist, muss stattdessen ein Komparator verwendet werden, der die Werte auswertet.
Ein Versuch, einen solchen Komparator zu implementieren, könnte wie folgt aussehen:
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; } } }
Dieser Ansatz ist jedoch fehlerhaft, da eine TreeMap nicht ausschließlich auf der Grundlage von Werten sortieren kann. Es ist darauf ausgelegt, seine Schlüssel zu sortieren, nicht die mit diesen Schlüsseln verknüpften Werte.
Alternative Lösung: Map.Entry sortieren
Um diese Einschränkung zu überwinden, kann eine externe Sammlung verwendet werden Wird zum Sortieren der Map.entrySet()-Sammlung verwendet. Dieser sortierte Satz ermöglicht das Filtern und Sortieren basierend auf den Werten. Hier ist eine generische Methode, die Map.entrySet() nach Werten sortiert:
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; }
Mit dieser Methode kann ein sortierter Satz von Map.Entries basierend auf Werten erhalten werden, wie unten gezeigt:
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]"
Hinweis zur Ganzzahlgleichheit
Es ist erwähnenswert, dass der bereitgestellte Code == verwendet um ganzzahlige Werte zu vergleichen. Dies wird im Allgemeinen nicht empfohlen, da hier die Referenzgleichheit und nicht die Wertgleichheit geprüft wird. In einigen Szenarien kann es zu unerwarteten Ergebnissen kommen. Für Wertevergleiche sollten stattdessen vorzugsweise Methoden wie „compareTo()“ verwendet werden.
Das obige ist der detaillierte Inhalt vonWie kann ich eine TreeMap nach ihren Werten sortieren, nicht nach Schlüsseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!