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().

Bick
quelle
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.

Barth
quelle
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.

Tom Jefferys
quelle
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/.

CrazyCoder
quelle
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>();
Thilo
quelle
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.

Herr Smith
quelle
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

Basil Bourque
quelle