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?

2voto

Jafar Sadik Punkte 11

Zu viele Antworten gefunden. Einige waren wirklich großartig. Aber ich habe insbesondere nach einem Weg gesucht, um den Wert mit Schleifen abzurufen.

Also hier ist schließlich, was ich gemacht habe: Für eine HashMap 1-zu-1 Beziehung:

    Map map = new HashMap();

    map.put("abc", "123");
    map.put("xyz", "456");

    for(Entry entry : map.entrySet()) {
        if(entry.getValue().equalsIgnoreCase("456")) {
            System.out.println(entry.getKey());
        }
    }

Ausgabe: "xyz"

Für eine HashMap 1-zu-viele Beziehung:

    Map> service = new HashMap>();

    service.put("abc", new ArrayList());
    service.get("abc").add("a");
    service.get("abc").add("b");
    service.get("abc").add("c");

    service.put("xyz", new ArrayList());
    service.get("xyz").add("x");
    service.get("xyz").add("y");
    service.get("xyz").add("z");

    for(Entry> entry : service.entrySet()) {
        ArrayList values = entry.getValue();
        for(String value : values) {
            if(value.equalsIgnoreCase("x")) {
                System.out.println(entry.getKey());
            }
        }

    }

Ausgabe: xyz

-Danke

2voto

Jayen Punkte 5149

Verwenden Sie einen dünnen Wrapper: HMap

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HMap {

   private final Map> map;

   public HMap() {
      map = new HashMap>();
   }

   public HMap(final int initialCapacity) {
      map = new HashMap>(initialCapacity);
   }

   public boolean containsKey(final Object key) {
      return map.containsKey(key);
   }

   public V get(final Object key) {
      final Map entry = map.get(key);
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }

   public K getKey(final Object key) {
      final Map entry = map.get(key);
      if (entry != null)
         return entry.keySet().iterator().next();
      return null;
   }

   public V put(final K key, final V value) {
      final Map entry = map
            .put(key, Collections.singletonMap(key, value));
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }
}

2voto

Amit Punkte 75

Sie können den Schlüssel mithilfe der Werte mit folgendem Code abrufen:

ArrayList valuesList = new ArrayList();
Set keySet = initalMap.keySet();
ArrayList keyList = new ArrayList(keySet);

for(int i = 0 ; i < keyList.size() ; i++ ) {
    valuesList.add(initalMap.get(keyList.get(i)));
}

Collections.sort(valuesList);
Map finalMap = new TreeMap();
for(int i = 0 ; i < valuesList.size() ; i++ ) {
    String value = (String) valuesList.get(i);

    for( int j = 0 ; j < keyList.size() ; j++ ) {
        if(initalMap.get(keyList.get(j)).equals(value)) {
            finalMap.put(keyList.get(j),value);
        }   
    }
}
System.out.println("Endgültige Karte ------------------------> " + finalMap);

2voto

Carl Punkte 7410

Ja, du musst durch die Hashmap iterieren, es sei denn, du implementierst etwas entlang der Linien von dem, was diese verschiedenen Antworten vorschlagen. Anstatt mit dem entrySet herumzuspielen, würde ich nur das keySet() holen, darüber iterieren und den (ersten) Schlüssel behalten, der dir den passenden Wert liefert. Wenn du alle Schlüssel benötigst, die diesen Wert entsprechen, musst du offensichtlich das Ganze machen.

Wie Jonas vorschlägt, könnte das bereits das sein, was die containsValue-Methode tut, sodass du diesen Test vielleicht einfach überspringen und jedes Mal die Iteration durchführen kannst (oder vielleicht eliminiert der Compiler bereits die Redundanz, wer weiß).

Im Vergleich zu den anderen Antworten, wenn deine umgekehrte Abbildung so aussieht

Map>

kannst du mit nicht-eindeutigen Schlüssel-Wert-Zuordnungen umgehen, wenn du diese Fähigkeit benötigst (abgesehen davon, sie zu entwirren). Das würde sich gut in eine der Lösungen einfügen, die hier von Leuten vorgeschlagen werden, die zwei Maps verwenden.

2voto

Amazing India Punkte 31
public static String getKey(Map mapref, String value) {
    String key = "";
    for (Map.Entry map : mapref.entrySet()) {
        if (map.getValue().toString().equals(value)) {
            key = map.getKey();
        }
    }
    return key;
}

0 Stimmen

Map map = new HashMap(); map.put("A", 1); map.put("B", 2); map.put("C", 3); map.put("D", 4); // System.out.println(map); System.out.println(getKey(map, "4"));

1 Stimmen

Was passiert, wenn mehrere Schlüssel denselben Wert haben?

0 Stimmen

Wenn Sie mehrere Schlüssel mit demselben Wert übergeben, erhalten wir den letzten Schlüssel als Ergebnis. Beispiel: A 1, B 1, C 1, D 2 Ausgabe: Wenn wir den Wert 1 übergeben, lautet die Ausgabe C

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