Wie verwende ich die SortedMap-Schnittstelle oder TreeMap in Java?

Lesezeit: 6 Minuten

Bicks Benutzeravatar
Bick

Ich habe ein

 Map<Float, MyObject>

Was ist der beste Weg, um die Karte nach Float sortiert zu halten?

Ist SortedMap oder TreeMap die beste antwort?
Wie benutze ich es?

Ich erstelle die Map nur einmal und ersetze die MyObject häufig verwenden myMap.put() Und myMap.get().

  • Aber SortedMap ist eine Schnittstelle. TreeMap implementiert SortedMap.

    – Herr Schmidt

    15. September 2011 um 8:17 Uhr

  • Siehe die Antwort von gepostet @user157196 hier stackoverflow.com/questions/109383/…

    – Bitmap

    15. September 2011 um 8:18 Uhr


  • Suchen Sie nach der Antwort von Tom Jefferys

    – Johnny Lambada

    16. April 2014 um 0:54 Uhr

  • Zu Ihrer Information, NavigableMap Das in Java 6 hinzugefügte ersetzt das ältere SortedMap.

    – Basilikum Bourque

    18. Januar 2020 um 22:59 Uhr


Barths Benutzeravatar
Barth

ich würde … benutzen TreeMapdie 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());
}

Siehe die Java-Tutorial-Seite für SortedMap.
Und hier eine Liste von Tutorials im Zusammenhang mit TreeMap.

  • Warum tust du new Integer(n) statt nur die nackte ganze Zahl?

    – Adam_G

    30. Juli 2015 um 23:05 Uhr

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

    – Barth

    29. August 2015 um 12:57 Uhr

Benutzeravatar von Tom Jefferys
Tom Jeffreys

Eine TreeMap ist wahrscheinlich der einfachste Weg, dies zu tun. Sie verwenden es genau wie eine normale Map. 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 

Es lohnt sich, einen Blick in die API-Dokumente zu werfen, http://download.oracle.com/javase/6/docs/api/java/util/TreeMap.html um zu sehen, was man sonst noch damit machen kann.

Benutzeravatar des Teilnehmers
Lerner

Sie können TreeMap verwenden, das intern die SortedMap unten implementiert, ist das Beispiel

Sortierung 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());
  }

Sortierung nach absteigender Reihenfolge:

Wenn Sie dies immer möchten, erstellen Sie die Karte in absteigender Reihenfolge, wenn Sie sie nur einmal benötigen, erstellen Sie 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/

  • Ich würde diese Antwort bevorzugen, da sie das macht, wofür die SortedMap entwickelt wurde, indem sie den Comparator verwendet

    – CodeToLife

    1. März 2018 um 19:08 Uhr

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

Wie benutze ich es ?

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

Benutzeravatar von Mister Smith
Herr Schmidt

TreeMap Sortiert nach dem Schlüssel der natürlichen Reihenfolge. Die Schlüssel sollten implementieren Comparable oder kompatibel sein mit a Comparator (wenn Sie eine Instanz an den Konstruktor übergeben haben). In Ihrem Fall Float bereits umsetzt Comparable Sie müssen also nichts Besonderes tun.

Du kannst anrufen keySet um alle Schlüssel in aufsteigender Reihenfolge abzurufen.

tl;dr

Verwenden Sie eine der Map Implementierungen, die mit Java 6 und höher gebündelt sind, implementieren NavigableMap (Nachfolger von SortedMap):

  • Verwenden TreeMap wenn Single-Threaded ausgeführt wird oder wenn die Map nach dem ersten Auffüllen über Threads hinweg schreibgeschützt sein soll.
  • Verwenden ConcurrentSkipListMap wenn die Karte über Threads hinweg manipuliert wird.

NavigableMap

FYI, die SortedMap Schnittstelle wurde von der abgelöst NavigableMap Schnittstelle.

Sie müssten nur verwenden SortedMap wenn Sie Implementierungen von Drittanbietern verwenden, die ihre Unterstützung noch nicht erklärt haben NavigableMap. Von den mit Java gebündelten Karten werden beide Implementierungen implementiert SortedMap auch umsetzen NavigableMap.

Schnittstelle versus konkrete Klasse

s SortedMap die beste Antwort? Baumkarte?

Wie andere erwähnt haben, SortedMap ist eine Schnittstelle während TreeMap ist eine von mehreren Implementierungen dieser Schnittstelle (und der neueren NavigableMap.

Wenn Sie über eine Schnittstelle verfügen, können Sie Code schreiben, der die Zuordnung verwendet, ohne dass dies unterbrochen wird, wenn Sie sich später entscheiden, zwischen Implementierungen zu wechseln.

NavigableMap< Employee , Project > currentAssignments = new TreeSet<>() ;
currentAssignments.put( alice , writeAdCopyProject ) ; 
currentAssignments.put( bob , setUpNewVendorsProject ) ; 

Dieser Code funktioniert immer noch, wenn später Implementierungen geändert werden. Vielleicht benötigen Sie später eine Zuordnung, 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.

Umsetzung wählen

Es gibt zehn Implementierungen von Map gebündelt mit Java 11. Und weitere Implementierungen von Drittanbietern wie z Google Guave.

Hier ist eine grafische Tabelle, die ich erstellt habe, um die verschiedenen Merkmale jedes 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. Auch, EnumMap hält seine Schlüssel in der Reihenfolge der Objekte, die in dieser Aufzählung definiert sind. Zuletzt die LinkedHashMap merkt sich die ursprüngliche Insertionsreihenfolge.

Tabelle der Kartenimplementierungen in Java 11 mit Vergleich ihrer Funktionen

Benutzeravatar von Willem van der Veen
Willem van der Veen

Du kannst den … benutzen TreeMap Klasse für diesen Zweck, die die implementiert SortedMap Schnittstelle.

Die Klasse TreeMap implementiert die NavigableMap Schnittstelle, die die erweitert SortedMap Schnittstelle.

Dies hat zur Folge, dass alle Schlüssel entsprechend ihrer Implementierung geordnet werden Comparable Schnittstelle.

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

// Add Items to the TreeMap
map.put(9999, "foo");
map.put(23432, "bar");
map.put(6, "foobar");
map.put(12, "baz");

Die Schlüssel sind jetzt automatisch sortiert. Wenn wir sie durchlaufen, erhalten wir Folgendes:

map.forEach((k, v) -> System.out.println("key: " + k));

// output:
// key: 6
// key: 12
// key: 9999
// key: 23432

Weil TreeMap Elemente müssen bestellt werden. Die Objekte, die als Schlüssel verwendet werden, müssen eine Implementierung von haben Comparable Schnittstelle. Der folgende Code löst beispielsweise einen Laufzeitfehler aus:

class Human{}
Map<Human, String> map = new TreeMap<>();

// Following throws a exception:
// Exception in thread "main" java.lang.ClassCastException:
// class Example$1Human cannot be cast to class java.lang.Comparable 
map.put(new Human(), "baz");

1449950cookie-checkWie verwende ich die SortedMap-Schnittstelle oder TreeMap in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy