Voici une solution sans flux (peut-être plus facile à comprendre) :
Iterator<UserDetail> it=userDetails.iterator();
Map<String,UserDetail> found=new HashMap<>();
while(it.hasNext()){
UserDetail next=it.next();
if(found.containsKey(next.getUserName())){
found.get(next.getUserName()).setUserSalery(found.get(next.getUserName()).getUserSalery()+next.getUserSalery();
it.remove();
}
else{
found.put(next.getUserName(),next);
}
}
Cela permet d'itérer à travers tous les éléments.
S'il a déjà trouvé un élément correspondant, il y ajoute sa propre salade et se retire de la liste.
Sinon, il se marque lui-même pour être trouvé si d'autres éléments sont trouvés avec le même nom plus tard.
Cela suppose que UserDetail
possède des méthodes standard de récupération et de modification des données pour userName
y userSalery
.
Notez qu'une boucle for-each ne peut pas être utilisée parce que vous ne pouvez pas modifier le contenu de la liste dans cette boucle (cela déclencherait une erreur de type ConcurrentModificationException
).
D'après les commentaires(de @ Holger :
Vous pouvez utiliser un seul UserDetail previous = found.putIfAbsent(next.getName());
suivi par if(previous != null) { previous.setSalery(previous.getSalery()+next.getSalery()); it.remove(); }
au lieu de chercher la carte trois fois de suite.
Ce code serait :
Iterator<UserDetail> it=userDetails.iterator();
Map<String,UserDetail> found=new HashMap<>();
while(it.hasNext()){
UserDetail next=it.next();
UserDetail previous = found.putIfAbsent(next.getUserName());
if(previous != null) {
previous.setUserSalery(previous.getUserSalery()+next.getUserSalery());
it.remove();
}
}
Cela fait essentiellement la même chose.
Il ajoute l'élément actuel à la liste s'il n'existe pas et sinon, il additionne simplement la saleté.