web-dev-qa-db-fra.com

Obtenir les clés de HashMap dans Java

J'ai un Hashmap dans Java comme ceci:

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

Puis je le remplis comme ceci:

team1.put("United", 5);

Comment puis-je obtenir les clés? Quelque chose comme: team1.getKey() pour retourner "United".

145
masb

Un HashMap contient plus d'une clé. Vous pouvez utiliser keySet() pour obtenir le jeu de toutes les touches.

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

va stocker 1 avec la touche "foo" et 2 avec la touche "bar". Pour parcourir toutes les clés:

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

imprimera "foo" et "bar".

284
Matteo

C'est faisable, du moins en théorie, si vous connaissez l'index:

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

keySet() renvoie un ensemble, vous le convertissez donc en tableau.

Le problème, bien sûr, est qu'un ensemble ne promet pas de garder votre commande. Si vous avez un seul élément dans votre HashMap, vous êtes bon, mais si vous avez plus que cela, il est préférable de parcourir la carte, comme d'autres réponses l'ont fait.

44
james.garriss

Vérifie ça.

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

(Utilisez Java.util.Objects.equals car HashMap peut contenir null.)

Utiliser 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());
}

Plus "générique" et aussi sûr que possible

/**
 * 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());
}

Ou si vous êtes sur JDK7.

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.

Vous pouvez récupérer toutes les clés de Map à l'aide de la méthode keySet() . Maintenant, si vous avez besoin d’obtenir une clé à partir de sa valeur , c’est une toute autre affaire et Map ne vous aidera pas dans cette tâche; vous aurez besoin d'une structure de données spécialisée, telle que BidiMap (une carte permettant la recherche bidirectionnelle entre clé et valeurs) à partir d'Apache Commons Collections - sachez également que plusieurs clés différentes peuvent être mappé à la même valeur.

6
Óscar López

Si vous avez juste besoin de quelque chose de simple et de plus d'une vérification.

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

Ensuite, vous pouvez rechercher n'importe quelle clé.

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

Lorsque vous souhaitez obtenir un argument (United) pour lequel une valeur est donnée (5), vous pouvez également envisager d’utiliser une carte bidirectionnelle (fournie par exemple par Guava: http: //docs.guava -libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html ).

1

Une solution peut être, si vous connaissez la position de la clé, convertir les clés dans un tableau de chaînes et renvoyer la valeur dans la position:

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

    return keys[pos];
}
0
Orici