wake-up-neo.com

Holen Sie sich Schlüssel von HashMap in Java

Ich habe eine Hashmap in Java wie folgt:

private Map<String, Integer> team1 = new HashMap<String, Integer>();

Dann fülle ich es so aus:

team1.put("United", 5);

Wie kann ich die Schlüssel bekommen? So etwas wie: team1.getKey() um "United" zurückzugeben.

145
masb

Ein HashMap enthält mehr als einen Schlüssel. Sie können keySet() verwenden, um den Satz aller Tasten abzurufen.

team1.put("foo", 1);
team1.put("bar", 2);

speichert 1 mit der Taste "foo" und 2 mit der Taste "bar". So durchlaufen Sie alle Schlüssel:

for ( String key : team1.keySet() ) {
    System.out.println( key );
}

druckt "foo" und "bar".

284
Matteo

Dies ist zumindest theoretisch machbar, wenn Sie kennen den Index:

System.out.println(team1.keySet().toArray()[0]);

keySet() gibt eine Menge zurück, sodass Sie die Menge in ein Array konvertieren.

Das Problem ist natürlich, dass ein Set nicht verspricht, Ihre Bestellung aufrechtzuerhalten. Wenn Sie nur ein Element in Ihrer HashMap haben, sind Sie gut, aber wenn Sie mehr als das haben, ist es am besten, die Karte zu durchlaufen, wie es andere Antworten getan haben.

44
james.garriss

Überprüfen Sie dies.

https://docs.Oracle.com/javase/8/docs/api/Java/util/HashMap.html

(Verwenden Sie Java.util.Objects.equals, da HashMap null enthalten kann.)

Verwendung von JDK8 +

/**
 * Find any key matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return Any key matching the value in the team.
 */
private Optional<String> getKey(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .findAny();
}

/**
 * Find all keys matching a value.
 *
 * @param value The value to be matched. Can be null.
 * @return all keys matching the value in the team.
 */
private List<String> getKeys(Integer value){
    return team1
        .entrySet()
        .stream()
        .filter(e -> Objects.equals(e.getValue(), value))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
}

Mehr "generisch" und so sicher wie möglich

/**
 * Find any key matching the value, in the given map.
 *
 * @param mapOrNull Any map, null is considered a valid value.
 * @param value     The value to be searched.
 * @param <K>       Type of the key.
 * @param <T>       Type of the value.
 * @return An optional containing a key, if found.
 */
public static <K, T> Optional<K> getKey(Map<K, T> mapOrNull, T value) {
    return Optional.ofNullable(mapOrNull).flatMap(map -> map.entrySet()
            .stream()
            .filter(e -> Objects.equals(e.getValue(), value))
            .map(Map.Entry::getKey)
            .findAny());
}

Oder wenn Sie auf JDK7 sind.

private String getKey(Integer value){
    for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
            return key; //return the first found
        }
    }
    return null;
}

private List<String> getKeys(Integer value){
   List<String> keys = new ArrayList<String>();
   for(String key : team1.keySet()){
        if(Objects.equals(team1.get(key), value)){
             keys.add(key);
      }
   }
   return keys;
}
23
Fabio F.

Sie können alle Schlüssel der Map mit der Methode keySet() abrufen. Wenn Sie nun einen Schlüssel mit seinem Wert erhalten möchten , das ist eine ganz andere Sache und Map wird dir da nicht weiterhelfen; Sie benötigen eine spezielle Datenstruktur wie BidiMap (eine Karte, die eine bidirektionale Suche zwischen Schlüssel und Werten ermöglicht) aus Apaches Commons Collections - Sie müssen sich auch darüber im Klaren sein, dass mehrere verschiedene Schlüssel möglich sind auf den gleichen Wert abgebildet werden.

6
Óscar López

Wenn Sie nur etwas Einfaches und mehr von einer Überprüfung benötigen.

public String getKey(String key)
{
    if(map.containsKey(key)
    {
        return key;
    }
    return null;
}

Dann können Sie nach einem beliebigen Schlüssel suchen.

System.out.println( "Does this key exist? : " + getKey("United") );
2
tzg
private Map<String, Integer> _map= new HashMap<String, Integer>();
Iterator<Map.Entry<String,Integer>> itr=  _map.entrySet().iterator();
                //please check 
                while(itr.hasNext())
                {
                    System.out.println("key of : "+itr.next().getKey()+" value of      Map"+itr.next().getValue());
                }
2
sachin

Da Sie ein Argument (United) für den angegebenen Wert erhalten möchten (5), können Sie auch die Verwendung einer bidirektionalen Karte in Betracht ziehen (z. B. bereitgestellt von Guava: http: //docs.guava) -libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html ).

1

Eine Lösung kann sein, wenn Sie die Schlüsselposition kennen, die Schlüssel in ein String-Array umzuwandeln und den Wert an der Position zurückzugeben:

public String getKey(int pos, Map map) {
    String[] keys = (String[]) map.keySet().toArray(new String[0]);

    return keys[pos];
}
0
Orici