Это не вина коллекции, это то, как вы ее используете. Изменение коллекции на полпути через итерацию приводит к этой ошибке (что хорошо, так как итерация в целом будет невозможна для продолжения однозначно).
Редактировать: Перечитав вопрос, этот подход не сработает, хотя я оставляю его здесь как пример того, как избежать этой проблемы в общем случае.
То, что вы хотите что-то вроде этого:
for (Iterator<BusinessObject> iter = myCollection.iterator; iter.hasNext();)
{
BusinessObject anObject = iter.next();
if (someConditionIsTrue)
{
iter.remove();
}
}
Если удалить объекты с помощью самого итератора, он знает о удалении и все работает, как и следовало ожидать. Обратите внимание, что, хотя я думаю, что все стандартные коллекции хорошо работают в этом отношении, итераторам не требуется для реализации метода remove(), поэтому, если у вас нет контроля над классом myCollection
(и, следовательно, с классом реализации возвращаемого итератора), вы может потребоваться больше проверок безопасности.
Альтернативный подход (скажем, если вы не можете гарантировать итератор поддерживает remove()
и вам нужна такая функциональность), чтобы создать копию коллекции перебрать, затем удалить элементы из оригинальной коллекции ,
Edit: Вы можете, вероятно, использовать эту последнюю технику, чтобы достичь того, чего вы хотите, но вы все равно в конечном итоге возвращается к причине, почему итераторы бросить исключение в первую очередь: Что следует итерация делать, если вам удалить элемент, который он еще не достиг? Удаление (или нет) текущего элемента относительно хорошо определено, но вы говорите об удалении партнера текущего элемента, который, как я полагаю, может быть в случайной точке в итерируемой. Поскольку нет четкого способа, которым это должно быть обработано, вам нужно будет предоставить некоторую форму логики, чтобы справиться с этим. В этом случае я склоняюсь к созданию и заполнению новой коллекции во время итерации, а затем назначая ее переменной myCollection
в конце. Если это невозможно, то отслеживание элементов-партнеров для удаления и вызова myCollection.removeAll
- это путь.
Возможный дубликат [Java: эффективный эквивалент удаления во время итерации коллекции] (http://stackoverflow.com/questions/223918/java-efficient-equivalent-to-removing-while-iterating-a-collection) – McDowell