/ / Sortiere Map <String, Long> nach umgekehrtem Wert - Sortierung, Wörterbuch, Java-8, Java-Stream

Sort Map <String, Long> nach Wert umgekehrt - Sortierung, Wörterbuch, Java-8, Java-Stream

Ich habe ein Map<String, Long> map nach denen ich sortieren will Long Wert in umgekehrter Reihenfolge mit den Funktionen von Java 8. Mit Google fand ich Dieser Thread was diese Lösung bietet

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(comparing(Entry::getValue))
.collect(toMap(Entry::getKey, Entry::getValue,
(e1,e2) -> e1, LinkedHashMap::new));

Wenn ich die Reihenfolge in den Kommentaren umkehren lassen möchte, heißt es, zu verwenden comparing(Entry::getValue).reversed() Anstatt von comparing(Entry::getValue).

Der Code funktioniert jedoch nicht. Mit dieser kleinen Anpassung ist Folgendes möglich:

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(Comparator.comparing(Entry::getValue))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));

Muss ich zuerst einige Importe durchführen, um den ursprünglichen Code ausführen zu können?

Was noch übrig bleibt, ist die umgekehrte Reihenfolge, da

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(Comparator.comparing(Entry::getValue).reversed())
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));

gibt mir eine Fehlermeldung:

The type Map.Entry does not define getValue(Object) that is applicable here

Antworten:

8 für die Antwort № 1

Wie in diese Antwort, die Typinferenz von Java 8 stieß bei Ihnen an ihre Grenzen Kette Methodenaufrufe wie in Comparator.comparing(Entry::getValue).reversed().

Im Gegensatz dazu bei der Verwendung verschachtelt Aufrufe wie in Collections.reverseOrder(Comparator.comparing(Entry::getValue)) es wird klappen.

Natürlich können Sie verwenden static imports:

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(reverseOrder(comparing(Entry::getValue)))
.collect(toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));

Es ist jedoch zu beachten, dass der Compiler gerne irreführende Fehlermeldungen ausgibt, wenn Sie eine vergessen import static Anweisung (d. h. die Methode kann nicht gefunden werden) und kombinieren Sie sie mit Lambda-Ausdrücken oder Methodenreferenzen.


Als letzte Anmerkung gibt es auch die existierenden Komparator-Implementierungen Map.Entry.comparingByValue() und Map.Entry.comparingByValue(Comparator) die Sie verwenden können

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(reverseOrder(comparingByValue()))
.collect(toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));

oder

Map<String, Long> sortedMap = map.entrySet().stream()
.sorted(comparingByValue(reverseOrder()))
.collect(toMap(Entry::getKey, Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));