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?

0voto

Batman Punkte 121
  1. 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.

  2. 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 Sie T.zeile(a); verwenden, und Sie können auch Karte abfragen, indem Sie T.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 :

  1. Kann mehrere Werte verwenden.
  2. Effizienter bei der Verwendung großer Datensätze.

0voto

kervin Punkte 11462

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.

0voto

programmer Punkte 25

Probieren Sie dies aus:

static String getKeyFromValue(LinkedHashMap map,String value) {
    for (int x=0;x(map.values())).get(x) ).equals(value))
            return String.valueOf((new ArrayList(map.keySet())).get(x));
    }
    return null;
}

0voto

MilTy Punkte 145

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.

0voto

AConsumer Punkte 1891

Lassen Sie den Wert maxValue sein.

Set keySet = map.keySet();

keySet.stream().filter(x->map.get(x)==maxValue).forEach(x-> System.out.println(x));

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