web-dev-qa-db-fra.com

Java HashMap: Comment obtenir une clé et une valeur par index?

J'essaie d'utiliser un HashMap pour mapper une chaîne unique sur une chaîne ArrayList comme ceci:

HashMap<String, ArrayList<String>>

En gros, je veux pouvoir accéder aux clés par numéro, pas en utilisant le nom de la clé. Et je veux pouvoir accéder à la valeur de ladite clé, pour parcourir celle-ci. J'imagine quelque chose comme ça:

for(all keys in my hashmap) {
    for(int i=0; i < myhashmap.currentKey.getValue.size(); i++) {
        // do things with the hashmaps elements
    }
}

Y a-t-il un moyen facile de faire ceci?

24
Derek

Vous pouvez parcourir les touches en appelant map.keySet() ou les entrées en appelant map.entrySet(). Itérer sur les entrées sera probablement plus rapide.

for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    List<String> list = entry.getValue();
    // Do things with the list
}

Si vous voulez vous assurer de parcourir les clés dans le même ordre que vous les avez insérées, utilisez une variable LinkedHashMap.

Au fait, je vous conseillerais de changer le type déclaré de la carte en <String, List<String>>. Il est toujours préférable de déclarer les types en termes d’interface plutôt que d’implémentation.

27
Cameron Skinner

Voici la solution générale si vous ne voulez vraiment que la valeur de la première clé

Object firstKey = myHashMap.keySet().toArray()[0];
Object valueForFirstKey = myHashMap.get(firstKey);
57
dumonderic

Les tables de hachage ne sont pas commandées, sauf si vous utilisez une variable LinkedHashMap ou SortedMap. Dans ce cas, vous voudrez peut-être une LinkedHashMap. Cela itérera dans l'ordre d'insertion (ou dans l'ordre du dernier accès si vous préférez). Dans ce cas, il serait

int index = 0;
for ( Map.Entry<String,ArrayList<String>> e : myHashMap.iterator().entrySet() ) {
    String key = e.getKey();
    ArrayList<String> val = e.getValue();
    index++;
}

Il n’existe pas d’obtention directe (index) dans une carte car il s’agit d’une liste non ordonnée de paires clé/valeur. LinkedHashMap est un cas particulier qui garde la commande.

8
Jeff Storey

Une solution est déjà sélectionnée. Cependant, je publie cette solution pour ceux qui souhaitent utiliser une approche alternative:

// use LinkedHashMap if you want to read values from the hashmap in the same order as you put them into it
private ArrayList<String> getMapValueAt(LinkedHashMap<String, ArrayList<String>> hashMap, int index)
{
    Map.Entry<String, ArrayList<String>> entry = (Map.Entry<String, ArrayList<String>>) hashMap.entrySet().toArray()[index];
    return entry.getValue();
}
2
Sa Qada
for (Object key : data.keySet()) {
    String lKey = (String) key;
    List<String> list = data.get(key);
}
2
umesh

Tu peux faire:

for(String key: hashMap.keySet()){
    for(String value: hashMap.get(key)) {
        // use the value here
    }
}

Cela va parcourir chaque clé, puis chaque valeur de la liste associée à chaque clé.

1
jjnguy

Si vous ne vous souciez pas de la clé réelle, une façon concise d'itérer sur tout les valeurs de la carte serait d'utiliser sa méthode values()

Map<String, List<String>> myMap;

for ( List<String> stringList : myMap.values() ) {
    for ( String myString : stringList ) {
        // process the string here
    }
}

La méthode values() fait partie de l’interface Map et renvoie une vue Collection des valeurs de la carte.

0
fspinnenhirn

Les cartes de hachage ne conservent pas vos paires clé/valeur dans un ordre spécifique. Elles sont classées en fonction du hachage renvoyé par chaque clé à partir de sa méthode Object.hashCode (). Vous pouvez cependant parcourir l'ensemble des paires clé/valeur à l'aide d'un itérateur avec: 

for (String key : hashmap.keySet()) 
{
    for (list : hashmap.get(key))
    {
        //list.toString()
    }
}
0
kkress