208 votes

Obtenir des clés de HashMap en Java

J'ai une Hashmap en Java comme ceci :

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

Alors je le remplis comme ça :

team1.put("United", 5);

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

368voto

Matteo Points 5519

Un HashMap contient plus d'une clé. Vous pouvez utiliser keySet() pour obtenir l'ensemble de toutes les clés.

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

stockera 1 avec la clé "foo" et 2 avec la clé "bar". Pour itérer sur toutes les touches :

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

imprime "foo" et "bar".

61voto

james.garriss Points 3647

Ceci est faisable, du moins en théorie, si vous connaissez l'indice :

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

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

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

26voto

Fabio F. Points 586

Regarde ça.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

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

Utilisation de 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> findKey(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> findKeys(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> findKey(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 findKey(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> findKeys(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;
}

3voto

Emperor Points 41

Utilisez le fonctionnement fonctionnel pour une itération plus rapide.

team1.keySet().forEach((key) -> {
      System.out.println(key);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X