Heim >Java >javaLernprogramm >Wie kann ich eine TreeMap nach ihren Werten sortieren, nicht nach Schlüsseln?

Wie kann ich eine TreeMap nach ihren Werten sortieren, nicht nach Schlüsseln?

Linda Hamilton
Linda HamiltonOriginal
2024-12-23 05:59:23180Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn