2012-05-23 6 views
5

Gibt es eine Klasse in Java, die ein Array von Elementen in einer Reihenfolge enthält und für eine schnelle Suche optimiert ist?Hashed und indizierte Liste oder Array?

I.e. Ich muss Elemente sowohl durch numerischen Index (wie in Vector) und durch Hash (wie in HashMap) abrufen.

LinkedHashMap entspricht nicht

Ich denke LinkedHashMap nicht, da es um garantiert nicht trifft, aber nicht erlaubt schnellen Zugriff durch Index (Positionsnummer). Gemäß der Beschreibung muss die gesamte Kette durchquert werden, um eine bestimmte Position zu finden. Dies kann jeder mit Collection mit Iterator.

EDIT 2

D.h. Die Suche nach Schlüssel und nach Index sollte schnell erfolgen, nicht nur nach Schlüssel.

Antwort

2

Sie können eine Map für den schnellen Abruf von Elementen durch Hash verwenden. Per Definition ist ein Map ungeordnet und das Sprechen über Indizes macht wenig Sinn. es gewährleistet eine LinkedHashMap Mit von Nutzen sein könnte, da die Anzeigenauftrag bei Iterationszeit erhalten bleibt, obwohl Zugriff noch ein Element von Index wird einige zusätzliche Verarbeitung benötigen, etwa so:

map.entrySet().toArray()[index] // mind the casts, etc. 

Wenn Ihre Kartenänderungen selten, Obiges funktioniert gut, wenn Sie das Array zwischenspeichern und prüfen, ob sich die Größe der Map geändert hat, bevor Sie nach Index auf einen Eintrag zugreifen, und nur dann ein neues Array erstellen, wenn eine Größenänderung erkannt wurde. Wenn sich die Karte jedoch häufig ändert, müssen Sie das Array bei jedem Zugriff neu erstellen, wodurch eine Datenstruktur mit schlechter Leistung entsteht.

+0

Ich denke, 'toArray()' Methode wird Scannen Sie die gesamte Sammlung, die den ganzen Punkt sinnlos macht. –

+0

@SuzanCioc tatsächlich. Deshalb sage ich in meiner Antwort, es macht nur Sinn, wenn Ihre Karte selten wechselt und Sie das Array zwischenspeichern können –

2

Sie können versuchen LinkedHashSet, denke ich.

+0

Dies löst nicht das Problem, wie man auf ein Element mit seinem Index zugreifen kann. –

1

verwenden LinkedHashMap. Dadurch können Sie die Elemente über den Schlüssel abrufen. Außerdem können Sie die Elemente in derselben Reihenfolge abrufen, in der Sie sie gespeichert haben.

1

Ich glaube, Sie suchen LinkedHashMap

Aus der Dokumentation:

Hash-Tabelle und verknüpfte Liste Implementierung der Map-Schnittstelle, mit vorhersagbaren Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashMap insofern, als sie eine doppelt verknüpfte Liste enthält, die alle Einträge durchläuft. Diese verkettete Liste definiert die Iterationsreihenfolge, bei der es sich normalerweise um die Reihenfolge handelt, in der Schlüssel in die Karte eingefügt wurden (Einfügereihenfolge). Beachten Sie, dass die Reihenfolge der Anzeigen nicht betroffen ist, wenn ein Schlüssel erneut in die Karte eingefügt wird. (Ein Schlüssel k wird wieder in eine Map m eingefügt, wenn m.put (k, v) aufgerufen wird, wenn m.containsKey (k) unmittelbar vor dem Aufruf den Wert true zurückgibt.)

Verwandte Themen