web-dev-qa-db-fra.com

Comment parcourir une carte de hachage liée Java?

J'ai cherché cette question et trouvé des réponses qui utilisaient Map.Entry comme here , mais la méthode getValue () a renvoyé un objet Object au lieu du type d'objet de la carte. Comme dans l'exemple ci-dessous, j'ai besoin de renvoyer un objet User pour pouvoir utiliser une méthode de cette classe. Cependant, lorsque j'ai essayé d'utiliser la boucle while ci-dessous, elle ne la quittait jamais. Je me demandais la bonne façon de faire cela.

Map<String, User> users = new LinkedHashMap<String, User>();
users.put(name, user);

while(users.values().iterator().hasNext()){

   currentUser = users.values().iterator().next();
   currentUser.someMethod();
}
16
user1875021

Vous utilisez mal l'Iterator et vous omettez les spécifications Generics.

Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
  User currentUser = it.next();
  currentUser.someMethod();
}
17
user207421

Je me demandais la bonne façon de faire cela.

Vous devriez utiliser le type Map.Entry; il vous suffit de fournir les paramètres de type à utiliser avec les génériques:

for (Map.Entry<String,User> entry : users.entrySet()) {
    // entry.getValue() is of type User now
}
23
dasblinkenlight

Le moyen le plus simple d'itérer est d'utiliser pour. Dans un LinkedHashMap, ce serait comme ceci:

   private static LinkedHashMap<Integer, String> dataBase = new LinkedHashMap<Integer, String>();

   for(Integer key : dataBase.keySet()) {
         String ret = dataBase.get(key);
    }

La source

4
DaviF

Chaque fois que vous appelez .iterator(), vous obtenez un nouvel itérateur au premier élément.

Vous devez appeler .iterator() une fois et le stocker dans une variable locale.

3
SLaks

changez votre code pour cela:

Iterator<User> it = users.values().iterator();

    while (it.hasNext())
    {

        currentUser = it.next();
        currentUser.someMethod();  
    }
0
kakashy