Wie verwende ich die SortedMap-Schnittstelle in Java?


70

Ich habe ein

 Map<Float, MyObject>

Was ist der beste Weg, um die Karte nach dem Float zu sortieren?

Ist SortedMapdie beste Antwort? TreeMap? Wie benutze ich es?

Ich erstelle die Karte nur einmal und ersetze das MyObjecthäufig verwendete myMap.put()und myMap.get().


Aber SortedMap ist eine Schnittstelle. TreeMap implementiert SortedMap.
Mister Smith

Siehe die Antwort von @user157196hier stackoverflow.com/questions/109383/…
Bitmap

Suchen Sie nach Tom Jefferys Antwort
JohnnyLambada

Zu Ihrer Information, NavigableMapin Java 6 hinzugefügt, ersetzt die älteren SortedMap.
Basil Bourque

Antworten:


93

Ich würde verwenden TreeMap, was implementiert SortedMap. 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.


Warum machst du new Integer(n)statt nur der bloßen ganzen Zahl?
Adam_G

@Adam_G Kein besonderer Grund, ich denke, als ich diese Antwort schrieb, war ich nicht an Auto-Boxen gewöhnt (?).
Barth

46

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.


16

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/.


2
Ich würde diese Antwort vorziehen, da sie das macht, wofür die SortedMap entwickelt wurde, indem sie den Comparator
CodeToLife

3

TreeMap, eine Implementierung der SortedMap-Schnittstelle, würde funktionieren.

Wie benutze ich es ?

Map<Float, MyObject> map = new TreeMap<Float, MyObject>();

2

TreeMapsortiert nach der natürlichen Schlüsselreihenfolge. Die Schlüssel sollten a implementieren Comparableoder mit a kompatibel sein Comparator(wenn Sie eine Instanz an den Konstruktor übergeben haben). In Ihrem Fall Floatimplementiert bereits, Comparableso dass Sie nichts Besonderes tun müssen.

Sie können anrufen keySet, um alle Schlüssel in aufsteigender Reihenfolge abzurufen.


0

tl; dr

Verwenden Sie eine der Mapmit Java 6 und höher gebündelten Implementierungen NavigableMap(der Nachfolger von SortedMap):

  • Verwenden Sie TreeMapdiese Option, wenn Single-Threaded ausgeführt wird oder wenn die Map nach dem ersten Auffüllen für alle Threads schreibgeschützt sein soll.
  • Verwenden Sie ConcurrentSkipListMapdiese Option, wenn Sie die Map über mehrere Threads hinweg bearbeiten.

NavigableMap

Zu Ihrer Information, die SortedMapSchnittstelle wurde von der NavigableMapSchnittstelle abgelöst.

Sie müssen nur verwenden, SortedMapwenn Sie Implementierungen von Drittanbietern verwenden, deren Unterstützung noch nicht deklariert wurde NavigableMap. Von den mit Java gebündelten Karten werden auch beide implementierten Implementierungen SortedMapimplementiert NavigableMap.

Schnittstelle versus konkrete Klasse

s SortedMap die beste Antwort? TreeMap?

Wie andere erwähnt haben, SortedMaphandelt es sich um eine Schnittstelle, während TreeMapes sich um eine von mehreren Implementierungen dieser Schnittstelle (und der neueren) handelt NavigableMap.

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 Mapmit 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 EnumMaphält die Tasten in der Reihenfolge der auf dieser Enumeration definierten Objekte. Zuletzt LinkedHashMapmerkt sich die ursprüngliche Einfügereihenfolge.

Tabelle der Kartenimplementierungen in Java 11 zum Vergleich ihrer Funktionen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.