java hashmap: alle values durchgehen und key suchen?
Hey.. ich habe eine Frage zu einer HashMap, nehmen wir mal an ich habe diesen Code:
HashMap hMap = new HashMap();
hMap.put("1", "One");
hMap.put("2", "Two");
hMap.put("3", "Three"); *
Ich möchte jetzt aber alles Values durchgehen und den gesuchten Key suchen. also möchte ich z.B. den Key von "Two" bekommen. wie geht das? lg und danke im vorraus
1 Antwort
Du kannst über die Map Entrys iterieren:
for (Map.Entry entry : hMap.entrySet()) {
if ("Two".equals(entry.getValue()) {
return entry.getKey()
}
}
Wenn solche zugriffe häufiger sind solltest du eine Bidirektionale Map verwenden - zum beispiel eine BiMap aus dem Google Guava Framework.
Ehrlich gesagt:
Wer dabei noch keine Schmerzen hat
Ich hab da keine Schmerzen.
Den Tipp mit dem Profiler und beiden Map-Varianten habe ich mir zu Herzen genommen: Wenn ich was an meinem Code irgendwo verbessern kann, bin ich für alles offen.
Allerdings musste ich feststellen, dass die Hashmap bis ca. 20.000 Einträge sogar schneller ist und weniger Speicher verbraucht als die BiMap-Implementation: BiHashMap.
Daher würde ich mich an der Stelle gerne für eine etwas genauere Aufklärung freuen. Danke im voraus.
Danke für die Tipps! Ich habe jetzt eine BiMap in meinem Code eingebaut. Mein code sieht so aus:
public static BiMap<String, String> map = HashBiMap.create();
public static String getFirstString(String s) {
return map.inverse().get(s);
}
Aber wie kann ich ALLE keys finden, die zum Value passen? Ich brauche zwei methoden, einmal wie ich mit dem Key alle passenden Values finde und andersrum.
Ich habe die Methode von DexterNemrod ausprobiert, aber "map.Entry" funktioniert bei mir nicht.
Es handelt sich dabei um eine internes Interface Entry, das in der java.util.Map Klasse definiert ist. Ich gehe davon aus, dass du java.util.Map importiert hast und damit die Deklaration Map.Entry (achte darauf dass Map großgeschrieben wird) verwenden kannst.
Sollte das nicht funktionieren zeig doch mal bitte deinen Code auf z.B. http://hastebin.com
Bei einer BiMap verlangt die Datenstruktur, dass nicht nur jeder key nur einmal verwendet werden kann, sondern auch nur jeder Value. Sie bildet gewissermaßen eine 1:1 Verknüpfung ab, während eine normale Map eine n:1 verknüpfung ist (Beliebig viele Keys können auf denselben Value zeigen, aber jeder key hat nur einen Value).
Nein tut mir Leid, war mein Fehler. Ich dachte, dass mit "Map" der Name meiner HashBiMap gemeint ist. Aber das würde ja auch irgendwie keinen Sinn ergeben. ^^
Ich denke du wolltest den Key unter dem der übergebene Wert abgelegt ist ausgeben? Dann gibst du doch auch den Key zurück.
Nein, das habe ich ja schon gemacht, habe ja doch auch schon den Code davon geschrieben. Aber auf jeden Fall habe ich den Code jetzt zum Laufen bekommen, vielen Dank für die Hilfe und die schnellen Antworten!
Die erweiterte for-Schleife mit "hMap.entrySet()" bereitet mir sogar bei einmaligem Aufruf schon Schmerzen ... Zumindest bei mehr als einer Hand voll Einträge. ><
Wer dabei noch keine Schmerzen hat, bitte mal den Profiler anschmeißen und Javas Map mit Googles BiMap (oder einer eigenen Implementierung) vergleichen! :)