Strom hat als sorted
Methode, die Sie direkt in den Komparator als (x,y)->y.getKey().compareTo(x.getKey())
für absteigende Sortierung können daher einen Komparator akzeptiert. Um die Karte in aufsteigend sortieren wir die Bestellung als (x,y)->x.getKey().compareTo(y.getKey())
zur Konsolidierung Ergebnis zurück in LinkedHashMap umkehren können wir Collectors verwenden toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
die eine Collector zurück, die Elemente in eine Karte, deren Schlüssel und Werte sind das Ergebnis der Anwendung sammelt die stellten den Eingabeelementen Zuordnungsfunktionen zur Verfügung.
Arbeits Code
import java.io.*;
import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class HelloWorld{
public static void main(String []args){
LinkedHashMap<Integer,Integer> hashMap = new LinkedHashMap<Integer,Integer>();
hashMap.put(1,5);
hashMap.put(7,9);
hashMap.put(3,8);
hashMap.put(10,5);
Function<Map.Entry<Integer,Integer>,Integer> keyMapper = x->x.getKey();
Function<Map.Entry<Integer,Integer>,Integer> valueMapper = x->x.getValue();
BinaryOperator< Integer> mergeFunction = (x,y)->x;// we do not want any merging here
Supplier<LinkedHashMap<Integer,Integer>> mapRequired =()-> {return new LinkedHashMap<Integer,Integer>();};// to maintain order we must use LinkedHashMap
Comparator<Map.Entry<Integer,Integer>> descendingComparator = (x,y)->y.getKey().compareTo(x.getKey());
// we can write it as
System.out.println(
hashMap.entrySet().stream()
.sorted (descendingComparator)
.collect(Collectors.toMap(
keyMapper,
valueMapper,
mergeFunction,
mapRequired)
)
);
// or even by writing below will also work
System.out.println(
hashMap.entrySet().stream()
.sorted ((x,y)->y.getKey().compareTo(x.getKey()))
.collect(Collectors.toMap(
x->x.getKey(),
x->x.getValue(),
(x,y)->x,
LinkedHashMap::new)
)
);
}
}
Wie der Name ('comparingByValue') zeigt, ist der Typparameter des Lambda-Ausdrucks' v' nicht 'Eintrag 'weil Sie einen Komparator für die Werte bereitstellen, so dass Sie ihn in' comparingByValue ((v1, v2) -> v2.compareTo (v1)) '' oder besser 'comparingByValue (reverseOrder())' ändern können, wie von @Misha vorgeschlagen ... –
..und wie Sie gesagt haben, einen schnellen Blick auf den Quellcode von 'toMap' Sie sehen, dass es zurückgibt' toMap (keyMapper, valueMapper, werfenderMerger(), HashMap :: new); '. Also im Grunde wird Ihre Implementierung nichts sehr nützliches tun (obwohl Sie es aus der OP-Frage genommen haben) ... –
@AlexisC. Danke für den Kommentar. Das habe ich total vermisst. Das passiert, wenn ich Code schreibe, ohne zu versuchen, ihn zu kompilieren. – Eran