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();
}
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();
}
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
}
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);
}
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.
changez votre code pour cela:
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
currentUser = it.next();
currentUser.someMethod();
}