2010-07-20 3 views
1

Я использую расширенный цикл for через ArrayList и хотел удалить некоторые элементы, которые содержат определенное значение.Iteration, concurrentModifcationException в Java

Когда я пытаюсь это сделать, я получаю исключение выше. Я посмотрел вокруг, и, кажется, использование расширенного цикла, в то время как изменение коллекции - плохая идея. Как еще я буду заниматься этим?

благодарит за любую помощь.

ответ

4

Вы можете сохранить список подлежащих удалению элементов, а затем вызвать removeAll после завершения цикла.

Vector toRemove=new Vector(); 
for (Object o: array){ 
    if(remove(o)) toRemove.add(o); 
} 
array.removeAll(o); 
+1

Две вещи. Вы должны использовать ArrayList вместо Vector (вам не нужен вектор синхронизации). Также обратите внимание, что этот метод немного лучше/хуже для разных реализаций коллекции. ArrayList является одним из них, как будто вы удаляете кучу элементов, которые могут переупаковывать их больше за одну операцию, а не каждый раз, когда элемент удаляется (O (n), а не O (n^2)). – deterb

0

Это исключение может быть брошены методами, которые обнаруженными одновременное изменение объекта, когда такое изменение не допускается

3

Вы должны получить итератор для коллекции, ходить, что и вызов методы удалить() итератор когда вы хотите удалить элемент. Пожалуйста, имейте в виду, что не все реализации Iterator поддерживают remove(), это необязательный метод!

for(Iterator it = collection.iterator(); it.hasNext();) { 
    Object element = it.next(); 
    if(.. should remove element ..) 
    it.remove() 
} 
+0

Помните, что этот метод может быть довольно медленным для ArrayLists, хотя, вероятно, он будет немного быстрее с некоторыми другими методами из-за необходимости «искать» элементы, которые необходимо удалить (например, LinkedList и Sets). – deterb

1

Вы не можете использовать улучшенный цикл, чтобы сделать это, поскольку у вас нет доступа к Iterator используется. Вам необходимо использовать регулярный цикл и удалить элементы ArrayList через Iterator.remove().