исключение одновременной модификации Java, я не думаю, что я могу использовать итератор здесь? - PullRequest
2 голосов
/ 19 февраля 2012

У меня есть список, который нужно перебрать и удалить определенные элементы. Я не могу использовать итератор, потому что мне нужно вызывать методы для каждого элемента (например, ls.getStatus()), который не работает с итератором. Если ls.getStatus() == 0, мне нужно удалить этот элемент. Как я могу избежать ConcurrentModificationException?

for (MyList ls : list) {
    if (ls.getStatus() == 0) {
        ls.run();
        list.remove();
    } else {
        ls.create();
    }
}

Спасибо

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Почему вы не думаете, что можете использовать итератор?

Iterator<MyList> i = list.iterator();
while (i.hasNext()) {
    MyList ls = i.next();

    //... all your other code which uses ls...

    i.remove();
}

Этот подход также, вероятно, будет быстрее, поскольку использование iterator.remove() позволяет избежать необходимости искать элемент в списке, который необходим с помощью list.remove(item).

1 голос
/ 19 февраля 2012

Вы можете использовать итератор, но только оставив расширенный цикл for:

for (Iterator<MyList> iterator = list.iterator(); iterator.hasNext(); ) {
    MyList ls = iterator.next();
    if (ls.getStatus() == 0) {
        lo.run(zo);
        iterator.remove();
    } else {
        ls.create();
    }
}

Конечно, это предполагает, что list относится к типу, который поддерживает операцию удаления.

0 голосов
/ 19 февраля 2012

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

На первом шаге вы можете перебирать список, создавая список индексов удаляемых элементов. Следующим шагом будет повторение списка индексов в обратном направлении и удаление элементов по индексу.

...