Удаление элементов из списка

При просмотре списка я хотел бы удалить элемент списка в зависимости от условия. Смотрите код ниже.

Это дает мне исключение ConcurrentModification.

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

Как это можно сделать?

Комментарии к вопросу (2)
for (Iterator iter = list.listIterator(); iter.hasNext(); ) {
    String a = iter.next();
    if (...) {
        iter.remove();
    }
}

Делаем дополнительное предположение, что список строк. Как уже было получено, необходим list.iterator (). listIterator также может выполнять небольшую навигацию.

Комментарии (2)
Решение

Вам нужно использовать Iterator и вызывать remove ()на iterator вместо использования цикла for.

Комментарии (0)

Вы не можете сделать это, потому что вы уже зацикливаетесь на этом.

Чтобы избежать этой ситуации, используйте Iterator, который гарантирует вам безопасное удаление элемента из списка ...

List objs;
Iterator i = objs.iterator();
while (i.hasNext()) {
   Object o = i.next();
  //some condition
    i.remove();
}
Комментарии (0)

Вы не можете и не должны изменять список, повторяя его. Вы можете решить эту проблему, временно сохранив объекты для удаления:

List toRemove = new ArrayList();
for(Object a: list){
    if(a.getXXX().equalsIgnoreCase("AAA")){
        toRemove.add(a);
    }
}
list.removeAll(toRemove);
Комментарии (2)

Помимо всех отличных решений, предлагаемых здесь, я хотел бы предложить другое решение.

Я не уверен, что вы можете добавлять зависимости, но если вы можете, вы можете добавить https://code.google.com/p/guava-libraries/ в качестве зависимости. Эта библиотека добавляет поддержку многих основных функциональных операций на Java и может сделать работу с коллекциями намного проще и удобочитаемой.

В коде я заменил тип списка на T, поскольку я не знаю, для чего напечатан ваш список.

Эта проблема с гуавой может быть решена следующим образом:

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

И где-то еще вы затем определяете XXX_EQUAL_TO_AAA как:

public static final Predicate XXX_EQUAL_TO_AAA = new Predicate() {
    @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;
Комментарии (0)
//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);
Комментарии (3)