При просмотре списка я хотел бы удалить элемент списка в зависимости от условия. Смотрите код ниже.
Это дает мне исключение ConcurrentModification
.
for (Object a : list) {
if (a.getXXX().equalsIgnoreCase("AAA")) {
logger.info("this is AAA........should be removed from the list ");
list.remove(a);
}
}
Как это можно сделать?
for (Iterator<String> iter = list.listIterator(); iter.hasNext(); ) {
String a = iter.next();
if (...) {
iter.remove();
}
}
Делаем дополнительное предположение, что список строк.
Как уже было получено, необходим list.iterator ()
. listIterator также может выполнять небольшую навигацию.
Вы не можете сделать это, потому что вы уже зацикливаетесь на этом.
Чтобы избежать этой ситуации, используйте Iterator, который гарантирует вам безопасное удаление элемента из списка ...
List<Object> objs;
Iterator<Object> i = objs.iterator();
while (i.hasNext()) {
Object o = i.next();
//some condition
i.remove();
}
Вы не можете и не должны изменять список, повторяя его. Вы можете решить эту проблему, временно сохранив объекты для удаления:
List<Object> toRemove = new ArrayList<Object>();
for(Object a: list){
if(a.getXXX().equalsIgnoreCase("AAA")){
toRemove.add(a);
}
}
list.removeAll(toRemove);
Помимо всех отличных решений, предлагаемых здесь, я хотел бы предложить другое решение.
Я не уверен, что вы можете добавлять зависимости, но если вы можете, вы можете добавить https://code.google.com/p/guava-libraries/ в качестве зависимости. Эта библиотека добавляет поддержку многих основных функциональных операций на Java и может сделать работу с коллекциями намного проще и удобочитаемой.
В коде я заменил тип списка на T, поскольку я не знаю, для чего напечатан ваш список.
Эта проблема с гуавой может быть решена следующим образом:
List<T> filteredList = new Arraylist<>(filter(list, not(XXX_EQUAL_TO_AAA)));
И где-то еще вы затем определяете XXX_EQUAL_TO_AAA как:
public static final Predicate<T> XXX_EQUAL_TO_AAA = new Predicate<T>() {
@Override
public boolean apply(T input) {
return input.getXXX().equalsIgnoreCase("AAA");
}
}
Тем не менее, это, вероятно, излишне в вашей ситуации. Это просто то, что становится все более мощным, чем больше вы работаете с коллекциями.
Ой, также, вам нужен этот статический импорт:
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);