Ich habe Daten, die eher in einer Art "Schlüssel-Schlüssel" -Format als in einem "Schlüssel-Wert" organisiert sind. Es ist wie eine HashMap, aber ich brauche eine O (1) -Suche in beide Richtungen. Gibt es einen Namen für diese Art von Datenstruktur und ist so etwas in den Standardbibliotheken von Java enthalten? (oder vielleicht Apache Commons?)
Ich könnte meine eigene Klasse schreiben, die im Grunde zwei gespiegelte Karten verwendet, aber ich würde das Rad lieber nicht neu erfinden (wenn dies bereits existiert, ich aber einfach nicht nach dem richtigen Begriff suche).
quelle
Neben Apache Commons verfügt Guava auch über eine BiMap .
quelle
Hier ist eine einfache Klasse, mit der ich dies erledigt habe (ich wollte keine weitere Abhängigkeit von Drittanbietern haben). Es bietet nicht alle in Maps verfügbaren Funktionen, ist aber ein guter Anfang.
quelle
Wenn keine Kollisionen auftreten, können Sie immer beide Richtungen zur gleichen HashMap hinzufügen :-)
quelle
Hier meine 2 Cent.
Oder Sie können eine einfache Methode mit Generika verwenden. Stück Kuchen.
Natürlich müssen Sie eine Karte mit eindeutigen Werten haben. Andernfalls wird einer von ihnen ersetzt.
quelle
Inspiriert von GETahs Antwort habe ich beschlossen, selbst etwas Ähnliches mit einigen Verbesserungen zu schreiben:
Map<K,V>
-Interfaceput
(zumindest hoffe ich, dies hiermit zu garantieren).Die Verwendung erfolgt wie bei einer normalen Karte, um eine umgekehrte Ansicht des Zuordnungsaufrufs zu erhalten
getReverseView()
. Der Inhalt wird nicht kopiert, sondern nur eine Ansicht zurückgegeben.Ich bin mir nicht sicher, ob dies absolut narrensicher ist (wahrscheinlich auch nicht). Sie können also gerne einen Kommentar abgeben, wenn Sie Fehler bemerken, und ich werde die Antwort aktualisieren.
quelle
Eine ziemlich alte Frage hier, aber wenn jemand anderes wie ich eine Gehirnblockade hat und darüber stolpert, hilft dies hoffentlich.
Auch ich suchte nach einer bidirektionalen HashMap, manchmal ist es die einfachste Antwort, die am nützlichsten ist.
Wenn Sie das Rad nicht neu erfinden möchten und Ihrem Projekt keine anderen Bibliotheken oder Projekte hinzufügen möchten, können Sie eine einfache Implementierung paralleler Arrays (oder ArrayLists, wenn Ihr Design dies erfordert) durchführen.
Sobald Sie den Index von einem der beiden Schlüssel kennen, können Sie den anderen einfach anfordern. Ihre Suchmethoden könnten also ungefähr so aussehen:
Dies setzt voraus, dass Sie geeignete objektorientierte Strukturen verwenden, bei denen nur Methoden diese Arrays / ArrayLists ändern. Es wäre sehr einfach, sie parallel zu halten. Noch einfacher für eine ArrayList, da Sie nicht neu erstellen müssten, wenn sich die Größe der Arrays ändert, solange Sie sie gleichzeitig hinzufügen / entfernen.
quelle