web-dev-qa-db-fra.com

Java - Obtenir l'index de la clé dans HashMap?

Dans Java si je passe en boucle sur la keySet() d'un HashMap, comment puis-je (à l'intérieur de la boucle) obtenir l'index numérique de cette clé?

En gros, alors que je parcours la carte en boucle, je veux pouvoir obtenir 0,1,2 ... Je suppose que cela serait plus propre que de déclarer un int et de l'incrémenter à chaque itération.

Merci.

42
llm

Utilisez LinkedHashMap au lieu de HashMap Il retournera toujours les clés dans le même ordre (lors de l'insertion) lors de l'appel de keySet ()

Pour plus de détails, voir Classe LinkedHashMap

50
trayzey

Je ne sais pas s'il s'agit d'un "nettoyeur", mais:

List keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++) {
    Object obj = keys.get(i);
    // do stuff here
}
43
Binil Thomas

Le HashMap n'a pas d'ordonnancement défini des clés.

21
Matthew Flaschen

Si tout ce que vous essayez de faire est d'obtenir la valeur de la hashmap elle-même, vous pouvez faire quelque chose comme ce qui suit:

for (Object key : map.keySet()) {
    Object value = map.get(key);
    //TODO: this
}

Vous pouvez également parcourir les entrées d'une carte si c'est ce qui vous intéresse:

for (Map.Entry<Object, Object> entry : map.entrySet()) {
    Object key = entry.getKey();
    Object value = entry.getValue();
    //TODO: other cool stuff
}

En tant que communauté, nous pourrons peut-être vous donner des réponses meilleures/plus appropriées si nous avions une idée de la raison pour laquelle vous aviez besoin des index ou de ce que vous pensiez que les index pourraient vous apporter.

12
aperkins

Vous ne pouvez pas - un ensemble n'est pas ordonné, il n'y a donc pas d'index fourni. Vous devrez déclarer un int, comme vous dites. Rappelez-vous que la prochaine fois que vous appelez keySet (), vous n'obtiendrez pas nécessairement les résultats dans le même ordre.

9
Kris Jenkins

En termes simples, les collections basées sur un hachage ne sont pas indexées, vous devez donc le faire manuellement.

5
Esko

J'apprenais récemment les concepts de Hashmap et il était clair qu'il n'y avait pas de commande précise des clés. Pour itérer, vous pouvez utiliser:

Hashmap<String,Integer> hs=new Hashmap();
for(Map.Entry<String, Integer> entry : hs.entrySet()){
      String key=entry.getKey();
      int val=entry.getValue();
      //your code block  
  }
4
Neelesh Salian

Poster ceci comme une alternative tout aussi viable à la réponse de @Binil Thomas - a essayé de l'ajouter sous forme de commentaire, mais n'était pas convaincu de la lisibilité de tout cela.

int index = 0;

for (Object key : map.keySet()) {
   Object value = map.get(key);
   ++index;
}

Cela n’aidera probablement pas l’affiche originale de la question car c’est la situation littérale qu’ils essayaient d’éviter, mais elle pourrait aider les autres à la recherche d’une réponse facile.

3
Benjineer