Wenn jemand vertraut mit Objective-C ist , gibt es eine Sammlung genannt , NSOrderedSet
dass fungiert als Set und seine Elemente können als zugegriffen werden Array ‚s diejenigen.
Gibt es so etwas in Java?
Ich habe gehört, dass es eine Sammlung namens gibt LinkedHashMap
, aber ich habe so etwas für ein Set nicht gefunden.
java
collections
set
Uko
quelle
quelle
Antworten:
Schauen Sie sich die LinkedHashSet- Klasse an
Aus dem Java-Dokument :
Implementierung der Hash-Tabelle und der verknüpften Liste der Set-Schnittstelle mit vorhersagbarer Iterationsreihenfolge . Diese Implementierung unterscheidet sich von HashSet dadurch, dass eine doppelt verknüpfte Liste geführt wird, die alle Einträge durchläuft. Diese verknüpfte Liste definiert die Iterationsreihenfolge, dh die Reihenfolge, in der Elemente in die Menge eingefügt wurden (Einfügereihenfolge) . Beachten Sie, dass die Einfügereihenfolge nicht beeinflusst wird, wenn ein Element erneut in die Menge eingefügt wird . (Ein Element e wird erneut in eine Menge s eingefügt, wenn s.add (e) aufgerufen wird, wenn s.contains (e) unmittelbar vor dem Aufruf true zurückgeben würde.)
quelle
LinkedHashMap
aber ich habe es irgendwie nicht gefunden.LinkedHashSet
, mit der Sie herausfinden können, in welchem Index sich das Element ebenfalls befindet.Jeder Satz hat einen Iterator (). Der Iterator eines normalen HashSet ist ziemlich zufällig, ein TreeSet führt ihn nach Sortierreihenfolge aus, ein LinkedHashSet- Iterator iteriert nach Einfügereihenfolge .
Sie können jedoch kein Element in einem LinkedHashSet ersetzen. Sie können eines entfernen und ein anderes hinzufügen, aber das neue Element ersetzt nicht das Original. In einer LinkedHashMap können Sie einen Wert für einen vorhandenen Schlüssel ersetzen. Die Werte befinden sich dann weiterhin in der ursprünglichen Reihenfolge.
Sie können auch nicht an einer bestimmten Position einfügen.
Vielleicht sollten Sie eine ArrayList mit einer expliziten Prüfung verwenden, um das Einfügen von Duplikaten zu vermeiden.
quelle
LinkedHashSet
das tun sollte. Vielen Dank für die AntwortSchauen Sie sich das Java-Standard-API-Dokument an . Gleich daneben
LinkedHashMap
gibt es eineLinkedHashSet
. Beachten Sie jedoch, dass die Reihenfolge in diesen die Einfügereihenfolge ist, nicht die natürliche Reihenfolge der Elemente. Und Sie können nur in dieser Reihenfolge iterieren, keinen Direktzugriff ausführen (außer durch Zählen der Iterationsschritte).Es gibt auch eine Schnittstelle,
SortedSet
die vonTreeSet
und implementiert wirdConcurrentSkipListSet
. Beide erlauben die Iteration in der natürlichen Reihenfolge ihrer Elemente oder in einerComparator
, aber nicht zufälligen Zugriffs- oder Einfügereihenfolge.Für eine Datenstruktur, die sowohl über einen effizienten Zugriff per Index verfügt als auch das festgelegte Kriterium effizient implementieren kann, benötigen Sie eine Überspringliste , aber es gibt keine Implementierung mit dieser Funktionalität in der Java Standard-API, obwohl ich sicher bin, dass es einfach ist, eine zu finden im Internet.quelle
ConcurrentSkipListMap
undConcurrentSkipListSet
. Beide pflegen eine Sortierung basierend auf der natürlichen Reihenfolge oder einem Komparator. Ich verstehe nicht, ob sie den von Ihnen besprochenen Direktzugriff oder die Reihenfolge der Eingabe bieten.TreeSet
ist bestellt.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
quelle
Versuchen Sie es mit
java.util.TreeSet
diesen GerätenSortedSet
.So zitieren Sie das Dokument:
Beachten Sie, dass Hinzufügen, Entfernen und Enthalten ein Zeitkostenprotokoll (n) enthält.
Wenn Sie als Array auf den Inhalt des Sets zugreifen möchten, können Sie ihn folgendermaßen konvertieren:
Dieses Array wird nach denselben Kriterien wie das TreeSet sortiert (natürlich oder von einem Komparator), und in vielen Fällen hat dies einen Vorteil, anstatt ein Arrays.sort () auszuführen.
quelle
c
und dann Elementa
, wie ich Iterierte über eine Sammlung , die ich ihnen in der gleichen Reihenfolge zu bekommen:c
,a
usw.Baumsatz ist ein geordneter Satz, aber Sie können nicht über einen Elementindex zugreifen, sondern nur durchlaufen oder zum Anfang / Ende gehen.
quelle
Wenn es sich um eine kostengünstige Implementierung der Überspringliste handelt, frage ich mich in Bezug auf Big O, wie hoch die Kosten für diese Operation sind:
Ich meine, es bleibt immer in einer ganzen Array-Kreation stecken, also ist es O (n):
quelle
size()
Methode des zugrunde liegenden Satzes ab. Iteration ist normalerweiseO(n)
, Größe ist normalerweiseO(1)
außerConcurrentSkipListSet
wo es istO(n)
.IndexedTreeSet aus dem indizierten Baumkartenprojekt bietet diese Funktionalität (geordneter / sortierter Satz mit listenartigem Zugriff nach Index).
quelle
Möglicherweise erhalten Sie auch ein Dienstprogramm aus einer bidirektionalen Karte wie der
BiMap
von Google GuavaMit a
BiMap
können Sie eine Ganzzahl (für den zufälligen Indexzugriff) ziemlich effizient einem anderen Objekttyp zuordnen.BiMap
s sind eins zu eins, so dass jeder gegebenen Ganzzahl höchstens ein Element zugeordnet ist und jedem Element eine ganze Zahl zugeordnet ist. Es wird geschickt von zweiHashTable
Instanzen untermauert , verwendet also fast das Doppelte des Speichers, ist jedoch in Bezug auf dieList
Verarbeitung viel effizienter als ein benutzerdefinierter Speicher, dacontains()
(der aufgerufen wird, wenn ein Element hinzugefügt wird, um zu überprüfen, ob es bereits vorhanden ist) eine konstante Zeit ist und parallel-freundlicher Betrieb wieHashSet
's, währendList
die Implementierung viel langsamer ist.quelle
Ich hatte ein ähnliches Problem. Ich brauchte kein bestelltes Set, sondern eine Liste mit einem schnellen
indexOf
/contains
. Da ich dort nichts herausgefunden habe, habe ich selbst eines implementiert. Hier ist der Code, der beide implementiertSet
undList
obwohl nicht alle Massenlistenoperationen so schnell sind wie dieArrayList
Versionen.Haftungsausschluss: nicht getestet
quelle