Java-Äquivalent von C ++ std :: map?

8

Ich bin auf der Suche nach einer Java-Klasse mit den Eigenschaften von C ++ std :: map üblichen Implementierung (wie ich es verstehe, eine selbstbalancierende binäre Suchbaum):

  1. O (log n) Leistung für das Einfügen / Entfernen / Suchen
  2. Jedes Element besteht aus einem eindeutigen Schlüssel und einem zugeordneten Wert
  3. Schlüssel folgen einer strengen schwachen Reihenfolge

Ich suche nach Implementierungen mit Open-Source- oder Design-Dokumenten; Ich werde wahrscheinlich meine eigene Unterstützung für primitive Schlüssel / Werte rollen.

Der Stil dieser Frage ähnelt: Java entspricht std :: deque , dessen Antwort war "ArrayDeque from Primitive Collections for Java".

    
Rudiger 13.02.2010, 17:42
quelle

3 Antworten

7

ConcurrentSkipListMap ist eine sortierte Map, die mit einem Skip-Befehl versehen ist Liste (eine selbstbalancierende baumartige Struktur mit O (log n) -Leistung). Im Allgemeinen sind die Grenzen auf CSLM enger als TreeMap (das ist ein sich selbst ausbalancierender Rot-Schwarz-Baumimpl), so dass es wahrscheinlich bessere Ergebnisse liefert, mit dem Nebenvorteil, threadsicher und gleichzeitig zu sein, was TreeMap nicht ist. CSLM wurde in JDK 1.6 hinzugefügt.

Fund enthält eine Reihe von Sammlungen für primitive Typen und einige andere interessante Varianten der gängigen Java-Collection-Typen.

Zu den weiteren interessanten Sammlungsbibliotheken gehören die Google Collection-Bibliothek und Apache Commons Sammlungen .

    
Alex Miller 13.02.2010, 18:31
quelle
5

Die am nächsten zu einer Binärstruktur in den Java-Standardbibliotheken stehende Klasse ist java.util.TreeMap, unterstützt jedoch keine primitiven Typen, außer durch Boxen (dh int wird als Integer, Double als Double usw. umschlossen).

java.util.HashMap bietet wahrscheinlich eine bessere Leistung für große Karten. Theoretisch ist es O (1), aber seine genauen Leistungsmerkmale hängen von dem (den) Algorithmus (en) für die Erzeugung des Hash-Codes für die Schlüsselklasse (n) ab.

Laut Einführung in Sammlungen : "Arrays ... sind die einzige Sammlung, die unterstützt wird primitive Datentypen speichern. "

    
richj 13.02.2010 17:46
quelle
2

Sie können sich commons-collections ansehen FastTreeMap auch.

Ich bezweifle, dass Sie viele Sammlungen finden werden, die primitive Typen ohne Boxen unterstützen, also leben Sie einfach damit. Und das ist nicht unbedingt notwendig, wegen Autoboxing .

>

Wenn Sie wirklich primitive Elemente verwenden möchten (nachdem Sie Benchmarks erstellt haben, die eine unzureichende Performance aufweisen!), können Sie die Quelle von FastTreeMap sehen und Methoden zum Bearbeiten von Primitiven hinzufügen.

    
Bozho 13.02.2010 18:05
quelle