529 Stimmen

Java Hashmap: So erhalten Sie den Schlüssel vom Wert?

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?

12voto

David Tinker Punkte 8969

Wenn Sie die Karte in Ihrem eigenen Code erstellen, versuchen Sie, den Schlüssel und den Wert in der Karte zusammen zu platzieren:

public class KeyValue {
    public Object key;
    public Object value;
    public KeyValue(Object key, Object value) { ... }
}

map.put(key, new KeyValue(key, value));

Dann haben Sie, wenn Sie einen Wert haben, auch den Schlüssel.

3 Stimmen

Clever, aber was ist, wenn es 2 oder mehr KeyValue-Objekte gibt, die den gleichen Wert enthalten? Welchen Schlüssel sollte man wählen?

2 Stimmen

@Vineet, ich sehe nicht, wie dieser Ansatz die Frage des OPs löst. Was meintest du mit "Dann hast du auch den Schlüssel, wenn du einen Wert hast."?

9voto

André van Toly Punkte 546

Ich fürchte du wirst einfach deine Map durchlaufen müssen. Das Kürzeste, was mir einfallen konnte:

Iterator> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry entry = iter.next();
    if (entry.getValue().equals(value_you_look_for)) {
        String key_you_look_for = entry.getKey();
    }
}

9voto

user309309 Punkte 81
for(int key: hm.keySet()) {
    if(hm.get(key).equals(value)) {
        System.out.println(key); 
    }
}

7voto

Jonas K Punkte 4017

Es hört sich so an, als wäre der beste Weg, sich über Einträge mithilfe von map.entrySet() zu iterieren, da map.containsValue() dies wahrscheinlich ohnehin tut.

0 Stimmen

Ja, das ist genau das, was es macht. Aber natürlich gibt es true zurück, sobald es einen Wert findet, für den .equals true ist, im Gegensatz zu dem, was OP wahrscheinlich tun muss.

1 Stimmen

Nun, das Durchlaufen der Einträge kann mit dem Schlüssel zurückkehren, sobald es einen passenden Wert findet. Mehrere Übereinstimmungen schienen kein Problem zu sein.

7voto

The Berga Punkte 3628

Für die Android-Entwicklung mit Ziel-API < 19 funktioniert die Lösung von Vitalii Fedorenko für eine Eins-zu-Eins-Beziehung nicht, da Objects.equals nicht implementiert ist. Hier ist eine einfache Alternative:

public  K getKeyByValue(Map map, V value) {
    for (Map.Entry entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

0 Stimmen

Diese Lösung funktioniert für mich; Ich entwickle auch für eine archäologische Android-Version, in meinem Fall, um den Schlüssel eines Google Map-Markers zu erhalten, der in einer Karte in einem "onMarkerClick"-Ereignis gehalten wird. Das Iterieren über das entrySet funktioniert; Das Iterieren über die Schlüssel und das Abgleichen mit Einträgen mit get() und Vergleichen der Ausgabe hat jedoch nicht funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X