Den höchsten Wert in einer Java-Map finden

Den höchsten Wert in einer Java Map finden

1. Überblick

In diesem kurzen Tutorial werdenwe’ll explore various ways to find the maximum value in a Java Map. Wir werden auch sehen, wie neue Funktionen inJava 8diesen Vorgang vereinfacht haben.

Bevor wir beginnen, lassen Sie uns kurz zusammenfassen, wieobjects are comparedin Java ist.

Normalerweise können Objekte eine natürliche Reihenfolge ausdrücken, indem sie die MethodecompareTo() über dieComparable-Schnittstelle implementieren. Eine andere Ordnung als die natürliche Ordnung kann jedoch durch einComparator-Objekt angewendet werden. Wir werden diese im weiteren Verlauf genauer betrachten.

2. Vor Java 8

Lassen Sie uns zunächst untersuchen, wie wir den höchsten Wert ohne Java 8-Funktionen finden können.

2.1. Einfache Iteration verwenden

Mit der Iteration könnten wir einfach alle Einträge vonMap durchgehen, um den höchsten Wert auszuwählen und den aktuell höchsten in einer Variablen zu speichern:

public > V maxUsingIteration(Map map) {
    Map.Entry maxEntry = null;
    for (Map.Entry entry : map.entrySet()) {
        if (maxEntry == null || entry.getValue()
            .compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }
    return maxEntry.getValue();
}

Hier verwenden wir auch Java-Generika, um eine Methode zu erstellen, die auf verschiedene Typen angewendet werden kann.

2.2. Verwenden vonCollections.max()

Nun wollen wir sehen, wie die Dienstprogrammmethodemax() in der KlasseCollectionsuns davon abhalten kann, selbst viel davon zu schreiben:

public > V maxUsingCollectionsMax(Map map) {
    Entry maxEntry = Collections.max(map.entrySet(), new Comparator>() {
        public int compare(Entry e1, Entry e2) {
            return e1.getValue()
                .compareTo(e2.getValue());
        }
    });
    return maxEntry.getValue();
}

In diesem Beispielwe’re passing a Comparator object to max(), das die natürliche Reihenfolge derEntry-Werte durchcompareTo() nutzen oder eine andere Reihenfolge insgesamt implementieren kann.

3. Nach Java 8

Java 8-Funktionen können unseren obigen Versuch vereinfachen, den Maximalwert vonMap auf mehrere Arten zu erhalten.

3.1. Verwenden vonCollections.max() mit einem Lambda-Ausdruck

Beginnen wir mit der Untersuchung, wie Lambda-Ausdrücke den Aufruf vonCollections.max() vereinfachen können:

public > V maxUsingCollectionsMaxAndLambda(Map map) {
    Entry maxEntry = Collections.max(map.entrySet(), (Entry e1, Entry e2) -> e1.getValue()
        .compareTo(e2.getValue()));
    return maxEntry.getValue();
}

Wie wir hier sehen können, istlambda expressions save us from defining the full-fledged functional interface und bietet eine präzise Möglichkeit, die Logik zu definieren. Weitere Informationen zu Lambda-Ausdrücken finden Sie unterour previous article.

3.2. Verwenden vonStream

DieStream-API ist eine weitere Ergänzung zuJava 8, die das Arbeiten mit Sammlungen erheblich vereinfacht hat:

public > V maxUsingStreamAndLambda(Map map) {
    Optional> maxEntry = map.entrySet()
        .stream()
        .max((Entry e1, Entry e2) -> e1.getValue()
            .compareTo(e2.getValue())
        );

    return maxEntry.get().getValue();
}

Diese API bietet viele Datenverarbeitungsabfragen wiemap-reduce Transformationen für Sammlungen. Here, we’ve used max() over a stream of Map Entry, was ein Sonderfall einer Reduktionsoperation ist. Weitere Details zurStream-API finden Sie unterhere.

Wir verwenden hier auch die APIOptional, bei der es sich um ein in Java 8 hinzugefügtes Containerobjekt handelt, das möglicherweise einen Wert ungleich Null enthält oder nicht. Weitere Einzelheiten zuOptional erhalten Sie unterhere.

3.3. Verwenden vonStream mit Methodenreferenz

Zuletzt wollen wir sehen, wie Methodenreferenzen die Verwendung von Lambda-Ausdrücken weiter vereinfachen können:

public > V maxUsingStreamAndMethodReference(Map map) {
    Optional> maxEntry = map.entrySet()
        .stream()
        .max(Comparator.comparing(Map.Entry::getValue));
    return maxEntry.get()
        .getValue();
}

In Fällen, in denen Lambda-Ausdrücke lediglich eine vorhandene Methode aufrufen, können wir dies mithilfe einer Methodenreferenz direkt unter Verwendung des Methodennamens tun. Weitere Informationen zu method references finden Sie unterthis previous article.

4. Fazit

In diesem Artikel haben wir mehrere Möglichkeiten gesehen, den höchsten Wert inJava Map zu ermitteln. Einige davon verwendeten Funktionen, die im Rahmen von Java 8 hinzugefügt wurden.

Wie immer ist der Code für die Beispieleover on GitHub verfügbar.