Удаление элемента при повторении коллекции - PullRequest
4 голосов
/ 21 декабря 2010

Мне интересно, что на самом деле происходит за кулисами, когда я выполняю следующий код:

    List<Object> list = new ArrayList<Object>();
    fillTheList(); // Filling a list with 10 objects
    int count = 0;
    for (Object o : list) {
        count++;
        if (count == 5) {
            list.remove(count);
        }
        o.toString();
     }

После удаления элемента я получаю исключение ConcurrentModificationException.

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

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

получить Iterator вместо использования итератора в цикле for:

int count = 0;

for(final Iterator iterator = list.iterator(); iterator.hasNext();) {
    final Object o = iterator.next();

    if (++count == 5) {
        iterator.remove();
    }

    o.toString();
}

edit : причина, по которой вы получаете ConcurrentModificationException, заключается в том, что цикл for использует другой Iterator, который был создан до того, как ваше изменение будет выполнено с помощью list.remove() и что Iterator имеет состояние внутри.

1 голос
/ 21 декабря 2010

В принципе, вам не разрешено ссылаться на коллекцию (list в данном случае) внутри цикла foreach.

Попробуйте вместо этого:

List<Object> list = new ArrayList<Object>();
fillTheList(); // Filling a list with 10 objects
int count = 0;
ListIterator<Object> it = list.listIterator();
while (it.hasNext()) {
    Object o = it.next();
    count++;
    if (count == 5) {
        it.remove();
    }
    o.toString();
}
0 голосов
/ 21 декабря 2010

Обычно есть лучший способ сделать это, чем использовать iterator.remove (). например в вашем случае цикл такой же как

if(list.size()> 5) list.remove(5);

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

for(Iterator iterator = list.iterator(); iterator.hasNext();) {
    final Object o = iterator.next();

    if (++count == 5)
       iterator.remove();

    o.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...