Ich brauche eine Sammlung, die einen Wert basierend auf dem Schlüssel suchen kann und umgekehrt. Für jeden Wert gibt es einen Schlüssel und für jeden Schlüssel gibt es einen Wert. Gibt es eine einsatzbereite Datenstruktur, die das tut?Java Collection - Eindeutiger Schlüssel und eindeutiger Wert
Antwort
Die BiMap von Google Guava sieht aus wie es Ihnen passt.
Eine Bimap (oder "bidirektionale Karte") ist eine Karte, die die Eindeutigkeit ihrer Werte und der ihrer Schlüssel beibehält. Diese Einschränkung ermöglicht es Bimaps, eine "umgekehrte Ansicht" zu unterstützen, bei der es sich um eine weitere Bimap handelt, die dieselben Einträge wie diese Bimap enthält, jedoch umgekehrte Schlüssel und Werte.
Oder die BidiMap von Apache Commons Collections:
Definiert eine Karte, die zwischen Schlüssel und Werte bidirektionale Lookup ermöglicht.
Diese erweiterte
Map
stellt eine Zuordnung dar, bei der ein Schlüssel einen Wert suchen kann und ein Wert eine Taste mit gleicher Leichtigkeit nachschlagen kann. Diese Schnittstelle erweitert sich umMap
und kann daher überall dort verwendet werden, wo eine Karte benötigt wird. Die Schnittstelle bietet eine inverse Kartenansicht, die den vollen Zugriff auf beide Richtungen desBidiMap
ermöglicht.
Sie können BiMap von Eclipse Collections (vormals GS Sammlungen) verwenden.
BiMap
ist eine Karte, mit der Benutzer Nachschläge aus beiden Richtungen durchführen können. Sowohl die Schlüssel als auch die Werte in einer BiMap sind einzigartig.
Die wichtigste Implementierung ist HashBiMap
.
inverse()
BiMap.inverse()
gibt eine Ansicht, in der die Position des Schlüsseltypen und Wertetypen vertauscht.
MutableBiMap<Integer, String> biMap =
HashBiMap.newWithKeysValues(1, "1", 2, "2", 3, "3");
MutableBiMap<String, Integer> inverse = biMap.inverse();
Assert.assertEquals("1", biMap.get(1));
Assert.assertEquals(1, inverse.get("1"));
Assert.assertTrue(inverse.containsKey("3"));
Assert.assertEquals(2, inverse.put("2", 4));
put()
MutableBiMap.put()
verhält sich wie Map.put()
auf einer regulären Karte, außer es, wenn ein doppelter Wert wirft hinzugefügt wird.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.put(1, "1"); // behaves like a regular put()
biMap.put(1, "1"); // no effect
biMap.put(2, "1"); // throws IllegalArgumentException
forcePut()
Das ist wie MutableBiMap.put()
verhält, aber es entfernt im Hintergrund die Karte Eintrag mit dem gleichen Wert, bevor das Schlüssel-Wert-Paar in der Karte setzen.
MutableBiMap<Integer, String> biMap = HashBiMap.newMap();
biMap.forcePut(1, "1"); // behaves like a regular put()
biMap.forcePut(1, "1"); // no effect
biMap.put(1, "2"); // replaces the [1,"1"] pair with [1, "2"]
biMap.forcePut(2, "2"); // removes the [1, "2"] pair before putting
Assert.assertFalse(biMap.containsKey(1));
Assert.assertEquals(HashBiMap.newWithKeysValues(2, "2"), biMap);
Hinweis: Ich bin ein Committer für Eclipse Kollektionen.
Die akzeptierte Antwort erwähnt BiMap
, aber es ist more up-to-date mit den Google Guava-Bibliotheken geworden.
A
BiMap<K, V>
ist einMap<K, V>
dass
- können Sie die "inverse"
BiMap<V, K>
mitinverse()
- gewährleistet sehen, dass die Werte sind einzigartig, so dass
values()
einSet
So können Sie mit Code wie folgt enden:
Einige Einsprüche mit diesem Objekt:
- Sie werden nicht in der Lage sein, nicht eindeutige Werte zu addieren, oder Sie werden eine
IllegalArgumentException
bekommen. Sie könnenforcePut(key, value)
verwenden, aber das wird override the existing key-value pair.
- 1. mysql eindeutiger Schlüssel
- 2. Eindeutiger Anwendungsschlüssel
- 3. Access SQL - zählen eindeutiger Wert
- 4. Compound/Composite primärer/eindeutiger Schlüssel mit Django
- 5. Pivot Query eindeutiger Spaltenfehler
- 6. Eindeutiger Spaltenwert pro Primärschlüssel
- 7. Eindeutiger Schlüssel erzeugen mit Ziffer und Buchstaben in PHP
- 8. Eindeutiger Wert in redis list/set
- 9. Entitätsdatenmodell, eindeutiger Index
- 10. XSLT: Extrahieren eindeutiger Attributwerte
- 11. eindeutiger Index verlangsamt?
- 12. MySQL Update eindeutiger Index
- 13. DB2 eindeutiger Index und automatische Nummerierung
- 14. Tropfen Eindeutiger Index Laravel 5
- 15. mysql eindeutiger Index aus Spaltensatz
- 16. VBA-Index/Übereinstimmung mit mehreren Kriterien (eindeutiger Wert und Datum)
- 17. Eindeutiger Datensatz in Asp.Net SQL
- 18. Lokijs: Einfügen eines Dokuments mit eindeutiger Schlüsselverletzung
- 19. BigQuery DeDuplication auf zwei Spalten als eindeutiger Schlüssel
- 20. Auswirkungen eines Eindeutiger Schlüssel in SQL Server 2005
- 21. MySQL-Frage - Eindeutiger Schlüssel Funktioniert nicht richtig, oder missverstehe ich?
- 22. Eindeutiger Schlüssel Fehler in Entity Framework-Code Erste
- 23. SQLite Eindeutiger Schlüssel mit einer Kombination aus zwei Spalten
- 24. Abfrage mit eindeutiger Zufallszahl auswählen
- 25. MySQL select * mit eindeutiger ID
- 26. Eindeutiger Satz von ungerichteten Kanten
- 27. Angular.js ng-repeat eindeutiger Bezeichner
- 28. Transaktionsreplikation ohne Primärschlüssel (eindeutiger Index)
- 29. Eindeutiger Zeiger in der Klasseninitialisierung
- 30. Entity Framework: Auswahl eindeutiger Objekte