Supprimer des éléments d’une liste

En parcourant une liste, j’aimerais supprimer un élément d’une liste en fonction d’une condition. Voir le code ci-dessous.

Cela me donne une exception ConcurrentModification .

 for (Object a : list) { if (a.getXXX().equalsIgnoreCase("AAA")) { logger.info("this is AAA........should be removed from the list "); list.remove(a); } } 

Comment cela peut-il être fait?

Vous devez utiliser Iterator et appeler remove() sur l’ iterator au lieu d’utiliser for loop.

 for (Iterator iter = list.listIterator(); iter.hasNext(); ) { Ssortingng a = iter.next(); if (...) { iter.remove(); } } 

Faire une supposition supplémentaire que la liste est de chaînes. Comme déjà répondu, un list.iterator() est nécessaire. Le listIterator peut aussi faire un peu de navigation.

Vous ne pouvez pas le faire parce que vous l’utilisez déjà.

Pour éviter cette situation, utilisez Iterator, qui vous permet de supprimer l’élément de la liste en toute sécurité …

 List objs; Iterator i = objs.iterator(); while (i.hasNext()) { Object o = i.next(); //some condition i.remove(); } 

Vous ne pouvez pas et ne devez pas modifier une liste en l’itérant. Vous pouvez résoudre ce problème en sauvegardant temporairement les objects à supprimer:

 List toRemove = new ArrayList(); for(Object a: list){ if(a.getXXX().equalsIgnoreCase("AAA")){ toRemove.add(a); } } list.removeAll(toRemove); 

Outre toutes les excellentes solutions proposées ici, j’aimerais proposer une solution différente.

Je ne sais pas si vous êtes libre d’append des dépendances, mais si vous le pouvez, vous pouvez append la https://code.google.com/p/guava-libraries/ comme dépendance. Cette bibliothèque prend en charge de nombreuses opérations fonctionnelles de base en Java et peut rendre le travail avec les collections beaucoup plus facile et plus lisible.

Dans le code, j’ai remplacé le type de la liste par T, car je ne sais pas à quoi votre liste est tapée.

Ce problème peut être résolu avec Guava comme ceci:

 List filteredList = new Arraylist<>(filter(list, not(XXX_EQUAL_TO_AAA))); 

Et ailleurs, vous définissez ensuite XXX_EQUAL_TO_AAA comme suit:

 public static final Predicate XXX_EQUAL_TO_AAA = new Predicate() { @Override public boolean apply(T input) { return input.getXXX().equalsIgnoreCase("AAA"); } } 

Cependant, cela est probablement exagéré dans votre situation. C’est juste quelque chose qui devient de plus en plus puissant au fur et à mesure que vous travaillez avec des collections.

Ohw, aussi, vous avez besoin de ces importations statiques:

 import static com.google.common.base.Predicates.not; import static com.google.common.collect.Collections2.filter; 
 //first find out the removed ones List removedList = new ArrayList(); for(Object a: list){ if(a.getXXX().equalsIgnoreCase("AAA")){ logger.info("this is AAA........should be removed from the list "); removedList.add(a); } } list.removeAll(removedList);