2017-12-05 4 views
1

Ich habe kürzlich eine gute Möglichkeit gefunden, eine Karte zu sortieren, die GregorianCalendar als Schlüssel enthält.Java Karte nach Schlüsselerklärung sortieren

Map<GregorianCalendar, String> map = new HashMap<>(); 

Map<GregorianCalendar, String> sortedMap = map.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
      (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

Kann mir jemand helfen, jedes Verfahren in diesem Befehl besonders geht aus der Stream-Funktion aufgerufen zu verstehen?

Dank

Antwort

4

map.entrySet().stream() erzeugt eine Stream der Einträge des Eingangs Map (dh ein Stream<Map.Entry<GregorianCalendar,String>>.

.sorted(Map.Entry.comparingByKey()) sortiert die Elemente dieser Stream durch die Tasten der Einträge (es beruht auf der Tatsache, dass die Schlüsseltyp - GregorianCalendar - Geräte Comparable)

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new))

.

erzeugt eine , die die gleichen Einträge enthält wie die Eingabe Map. Da Sie verwenden, wird der Anzeigenauftrag beibehalten, und da Sie die Einträge von Stream mit den Schlüsseln sortiert haben, erhalten Sie eine Map, deren Reihenfolge (und Iterationsreihenfolge) in der Reihenfolge der Schlüssel ist.

Natürlich können Sie eine sortierte Map leichter erhalten, indem alle Einträge des Eingangs setzen Map in einem TreeMap:

Map<GregorianCalendar, String> sortedMap = new TreeMap<>(map); 

Dies hat den Vorteil der Aufrechterhaltung der Ordnung, auch wenn Sie neue Einträge in der hinzufügen Map.

+0

Thank you! In der Tat scheint TreeMap die beste Wahl zu sein, solange der Schlüssel Comparable implementiert. –

+3

@GeekJunior 'TreeMap' kann auch verwendet werden, wenn der Schlüssel 'Comparable' nicht implementiert. In diesem Fall können Sie einen' Comparator' an den Konstruktor übergeben und dann die Eingabe 'Map' an' sortedMap.putAll() 'übergeben – Eran

2

Zuerst Einträge sortieren, indem Key über sorted(Map.Entry.comparingByKey())

dann werden diese zu einem Map gesammelt werden (die Implementierung unter verwendet HashMap), wo die Key vom Typ GregorianCalendar und Wert ist vom Typ String. Der Code liefert auch eine Druckfunktion:

(oldValue, newValue) -> oldValue 

, wo sie den letzten Wert halten, wenn es zu einer Kollision ist, wie eine „Last-gewinnt“ Politik. Wenn es sich also um eine Kollision handelt (zwei gleiche GregorianCalendar Werte), behalten Sie immer die zweite, was auch immer hier bedeutet. Da Ihre Quelle für das Streaming eine HashMap ist, die keine definierte Reihenfolge hat, kann sich diese "zweite" ändern, wenn Sie Werte aus Ihrer ursprünglichen Karte hinzufügen oder entfernen.

Sobald diese sortiert und sammeln Sie sie zu einem HashMap (via collect), bestellen Sie können brechen, so das Sammeln in einem LinkedHashMap geschieht grundsätzlich die Erhaltung, dass sortierter Reihenfolge

Verwandte Themen