Это не вина коллекции, это то, как вы ее используете. Изменение коллекции в середине итерации приводит к этой ошибке (что хорошо, поскольку итерацию в общем случае невозможно продолжить однозначно).
Редактировать : Перечитав вопрос, этот подход не сработает, хотя я оставлю его здесь в качестве примера того, как избежать этой проблемы в общем случае.
То, что вы хотите, выглядит примерно так:
for (Iterator<BusinessObject> iter = myCollection.iterator; iter.hasNext(); )
{
BusinessObject anObject = iter.next();
if (someConditionIsTrue)
{
iter.remove();
}
}
Если вы удаляете объекты через сам итератор, он знает об удалении, и все работает так, как вы ожидаете. Обратите внимание, что хотя я думаю, что все стандартные коллекции работают в этом отношении хорошо, итераторы не обязаны требовать реализации метода remove (), поэтому, если у вас нет контроля над классом myCollection
(и, следовательно, классом реализации возвращенного итератора) вам может понадобиться поставить больше проверок безопасности.
Альтернативный подход (скажем, если вы не можете гарантировать, что итератор поддерживает remove()
и вам требуется эта функциональность), это создать копию коллекции для итерации, а затем удалить элементы из оригинальная коллекция.
Редактировать : Вероятно, вы можете использовать эту последнюю технику для достижения того, чего хотите, но затем вы все равно вернетесь к причине, по которой итераторы вначале выдают исключение: Что следует итерацию делать, если вы удалите элемент, который еще не достиг ? Удаление (или нет) текущего элемента относительно четко определено, но вы говорите об удалении партнера текущего элемента , который, как я полагаю, мог бы быть в произвольной точке итерируемого элемента. Поскольку нет четкого способа, которым это должно быть обработано, вам нужно будет самостоятельно предоставить некоторую форму логики, чтобы справиться с этим. В этом случае я бы склонялся к созданию и заполнению новой коллекции во время итерации, а затем присваивал ее переменной myCollection
в конце. Если это невозможно, отслеживание элементов партнера, которые необходимо удалить, и вызов myCollection.removeAll
будет правильным решением.