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 № 1Wie 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
import
s:
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));