Ich habe ein
Map<Float, MyObject>
Was ist der beste Weg, um die Karte nach dem Float zu sortieren?
Ist SortedMap
die beste Antwort? TreeMap
? Wie benutze ich es?
Ich erstelle die Karte nur einmal und ersetze das MyObject
häufig verwendete myMap.put()
und myMap.get()
.
@user157196
hier stackoverflow.com/questions/109383/…NavigableMap
in Java 6 hinzugefügt, ersetzt die älterenSortedMap
.Antworten:
Ich würde verwenden
TreeMap
, was implementiertSortedMap
. Es ist genau dafür ausgelegt.Beispiel:
Map<Integer, String> map = new TreeMap<Integer, String>(); // Add Items to the TreeMap map.put(1, "One"); map.put(2, "Two"); map.put(3, "Three"); // Iterate over them for (Map.Entry<Integer, String> entry : map.entrySet()) { System.out.println(entry.getKey() + " => " + entry.getValue()); }
Weitere Informationen finden Sie auf der Java-Lernseite für SortedMap .
Und hier eine Liste von Tutorials zu TreeMap.
quelle
new Integer(n)
statt nur der bloßen ganzen Zahl?Eine TreeMap ist wahrscheinlich der einfachste Weg, dies zu tun. Sie verwenden es genau wie eine normale Karte. dh
Map<Float,String> mySortedMap = new TreeMap<Float,MyObject>(); // Put some values in it mySortedMap.put(1.0f,"One"); mySortedMap.put(0.0f,"Zero"); mySortedMap.put(3.0f,"Three"); // Iterate through it and it'll be in order! for(Map.Entry<Float,String> entry : mySortedMap.entrySet()) { System.out.println(entry.getValue()); } // outputs Zero One Three
Schauen Sie sich die API-Dokumente unter http://download.oracle.com/javase/6/docs/api/java/util/TreeMap.html an, um zu sehen, was Sie sonst noch damit tun können.
quelle
Sie können TreeMap verwenden, das die folgende SortedMap intern implementiert
Sortieren nach aufsteigender Reihenfolge:
Map<Float, String> ascsortedMAP = new TreeMap<Float, String>(); ascsortedMAP.put(8f, "name8"); ascsortedMAP.put(5f, "name5"); ascsortedMAP.put(15f, "name15"); ascsortedMAP.put(35f, "name35"); ascsortedMAP.put(44f, "name44"); ascsortedMAP.put(7f, "name7"); ascsortedMAP.put(6f, "name6"); for (Entry<Float, String> mapData : ascsortedMAP.entrySet()) { System.out.println("Key : " + mapData.getKey() + "Value : " + mapData.getValue()); }
Sortieren nach absteigender Reihenfolge:
Wenn Sie immer möchten, dass die Karte in absteigender Reihenfolge erstellt wird, erstellen Sie, wenn Sie sie nur einmal benötigen, eine TreeMap mit absteigender Reihenfolge und fügen Sie alle Daten aus der ursprünglichen Karte ein.
// Create the map and provide the comparator as a argument Map<Float, String> dscsortedMAP = new TreeMap<Float, String>(new Comparator<Float>() { @Override public int compare(Float o1, Float o2) { return o2.compareTo(o1); } }); dscsortedMAP.putAll(ascsortedMAP);
Weitere Informationen zu SortedMAP finden Sie unter http://examples.javacodegeeks.com/core-java/util/treemap/java-sorted-map-example/.
quelle
TreeMap, eine Implementierung der SortedMap-Schnittstelle, würde funktionieren.
Map<Float, MyObject> map = new TreeMap<Float, MyObject>();
quelle
TreeMap
sortiert nach der natürlichen Schlüsselreihenfolge. Die Schlüssel sollten a implementierenComparable
oder mit a kompatibel seinComparator
(wenn Sie eine Instanz an den Konstruktor übergeben haben). In Ihrem FallFloat
implementiert bereits,Comparable
so dass Sie nichts Besonderes tun müssen.Sie können anrufen
keySet
, um alle Schlüssel in aufsteigender Reihenfolge abzurufen.quelle
tl; dr
Verwenden Sie eine der
Map
mit Java 6 und höher gebündelten ImplementierungenNavigableMap
(der Nachfolger vonSortedMap
):TreeMap
diese Option, wenn Single-Threaded ausgeführt wird oder wenn die Map nach dem ersten Auffüllen für alle Threads schreibgeschützt sein soll.ConcurrentSkipListMap
diese Option, wenn Sie die Map über mehrere Threads hinweg bearbeiten.NavigableMap
Zu Ihrer Information, die
SortedMap
Schnittstelle wurde von derNavigableMap
Schnittstelle abgelöst.Sie müssen nur verwenden,
SortedMap
wenn Sie Implementierungen von Drittanbietern verwenden, deren Unterstützung noch nicht deklariert wurdeNavigableMap
. Von den mit Java gebündelten Karten werden auch beide implementierten ImplementierungenSortedMap
implementiertNavigableMap
.Schnittstelle versus konkrete Klasse
Wie andere erwähnt haben,
SortedMap
handelt es sich um eine Schnittstelle, währendTreeMap
es sich um eine von mehreren Implementierungen dieser Schnittstelle (und der neueren) handeltNavigableMap
.Mit einer Schnittstelle können Sie Code schreiben, der die Map verwendet, ohne zu brechen, wenn Sie später zwischen Implementierungen wechseln.
NavigableMap< Employee , Project > currentAssignments = new TreeSet<>() ; currentAssignments.put( alice , writeAdCopyProject ) ; currentAssignments.put( bob , setUpNewVendorsProject ) ;
Dieser Code funktioniert weiterhin, wenn später Implementierungen geändert werden. Möglicherweise benötigen Sie später eine Map, die Parallelität für die Verwendung über Threads hinweg unterstützt. Ändern Sie diese Erklärung in:
NavigableMap< Employee , Project > currentAssignments = new ConcurrentSkipListMap<>() ;
… Und der Rest Ihres Codes, der diese Karte verwendet, funktioniert weiterhin.
Implementierung auswählen
Es gibt zehn
Map
mit Java 11 gebündelte Implementierungen. Weitere Implementierungen werden von Drittanbietern wie Google Guava bereitgestellt .Hier ist eine grafische Tabelle, die ich erstellt habe, um die verschiedenen Funktionen der einzelnen hervorzuheben. Beachten Sie, dass zwei der gebündelten Implementierungen die Schlüssel in sortierter Reihenfolge halten, indem Sie den Inhalt des Schlüssels untersuchen. Außerdem
EnumMap
hält die Tasten in der Reihenfolge der auf dieser Enumeration definierten Objekte. ZuletztLinkedHashMap
merkt sich die ursprüngliche Einfügereihenfolge.quelle