2015-07-16 4 views
1

Мое требование, чтобы удалить из ArrayList, как это:Удалить элемент из ArrayList с помощью ListIterator в цикле внутри цикла

ArrayList<User> user = new ArrayList<User>(); 

ListIterator<User> outerIterator = null; 
ListIterator<User> innerIterator = null; 

User outer = null; 
User inner = null; 

for(outerIterator = user.listIterator(); outerIterator.hasNext();) { 
    outer = outerIterator.next(); 
    for(innerIterator = user.listIterator(); innerIterator.hasNext();) { 
     inner = innerIterator.next(); 
     if(SomeOperationOn(outer,inner)) { 
      innerIterator.remove(); 
     } 
    } 
} 

Приведенный выше код дает Exception

Exception in thread "main" java.util.ConcurrentModificationException 

, как и следовало ожидать, потому что я пытаюсь удалить из innerIterator, в то время как externalIterator - Итератор на том же объекте (пользователь).

Есть ли способ удалить элемент из ArrayList с помощью ListIterator в цикле внутри цикла?

+0

Даже если вы разрешите 'ConcurrentModificationException', из-за вызова' outerIterator.remove() 'ваш' ArrayList' будет пуст в конце этого кода. Это то, что вы хотите? – rgettman

+0

externalIterator.remove() Я использовал только для проверки, но да в конце списка циклов будет пусто. –

+0

Тогда почему бы просто не объявить новый пустой список равного размера? (или повторно инициализировать это?) – River

ответ

1

В изоляции, вызывая remove() на Iterator является правильным способом избежать ConcurrentModificationException при удалении элемента из коллекции, которую вы итерируете. Тем не менее, у вас есть дваIterator s, итерация по тем же ArrayList. Когда вы звоните remove() на innerIterator, outerIterator замечает, что список изменился, и он выбрасывает ConcurrentModificationException.

В этом случае, если SomeOperationOn указывает на то, что элемент должен быть удален, то вместо того, чтобы удалить его сразу же, хранить inner во временном List пунктов, которые будут удалены позже. После завершения цикла for на итераторах вызовите removeAll, пропуская этот временный список.