Wenn ich den Wert "foo"
habe und eine HashMap ftw
, für die ftw.containsValue("foo")
true
zurückgibt, wie kann ich den entsprechenden Schlüssel erhalten? Muss ich durch die HashMap schleifen? Wie ist der beste Weg, das zu tun?
Antworten
Zu viele Anzeigen?-
Wenn Sie den Schlüssel aus dem Wert erhalten möchten, ist es am besten, bidimap (bi-direktionale Karten) zu verwenden, um den Schlüssel aus dem Wert in O(1) Zeit zu erhalten.
Der Nachteil dabei ist jedoch, dass Sie nur eindeutige Schlüssel- und Wertesätze verwenden können.
-
Es gibt eine Datenstruktur namens Tabelle in Java, die nichts anderes als eine Karte von Karten ist, wie
Tabelle< A, B , C > == Karte < A , Karte < B, C > >
Hier können Sie
Karte
abfragen, indem SieT.zeile(a);
verwenden, und Sie können auchKarte
abfragen, indem SieT.spalte(b);
verwenden.
In Ihrem speziellen Fall fügen Sie C als Konstante ein.
Es ist also wie < a1, b1, 1 > < a2, b2 , 1 > , ...
Wenn Sie also über T.zeile(a1) finden ---> gibt Karte von --> erhalten Sie Schlüssel dieses zurückgegebenen Karte.
Wenn Sie den Schlüsselwert finden müssen, dann T.spalte(b2) --> gibt Karte von --> erhalten Sie Schlüssel dieses zurückgegebenen Karte.
Vorteile gegenüber dem vorherigen Fall :
- Kann mehrere Werte verwenden.
- Effizienter bei der Verwendung großer Datensätze.
Es ist wichtig zu beachten, dass seit dieser Frage Apache Collections Generische BidiMaps unterstützt. Daher sind einige der am meisten bewerteten Antworten zu diesem Punkt nicht mehr korrekt.
Für eine serialisierte BidiMap, die auch doppelte Werte unterstützt (Szenario 1-zu-viele), sollten Sie auch MapDB.org in Betracht ziehen.
Soweit ich weiß, werden Schlüssel und Werte einer HashMap nicht vermischt, wenn man sie als Arrays darstellt:
hashmap.values().toArray()
und
hashmap.keySet().toArray()
Also sollte der folgende Code (seit Java 8) wie erwartet funktionieren:
public Object getKeyByFirstValue(Object value) {
int keyNumber = Arrays.asList(hashmap.values().toArray()).indexOf(value);
return hashmap.keySet().toArray()[keyNumber];
}
Allerdings (WARNUNG!) funktioniert dieser Ansatz 2-3 Mal langsamer als die Iteration.