java hashmap: alle values durchgehen und key suchen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.

Daumen hoch für den letzten Absatz! Ein wichtiger Hinweis, denke ich! :)

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! :)

2
@TeeTier

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.

2
@KnusperPudding

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.

0
@Trachom

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).

1
@DexterNemrod

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. ^^

0
@Trachom

Mir ist noch ein Fehler aufgefallen, bei der Methode die du geschrieben hast muss man nicht "entry.getKey()" returnen sonder "entry.getValue()"

0
@Trachom

Ich denke du wolltest den Key unter dem der übergebene Wert abgelegt ist ausgeben? Dann gibst du doch auch den Key zurück.

0
@DexterNemrod

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!

0