Удаление элементов из коллекции в Java во время итерации по ней

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

Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> it = set.iterator();
while (it.hasNext()) {
    set.removeAll(setOfElementsToRemove(it.next()));
}

Но это кидаетConcurrentModificationException.

Обратите внимание, что iterator.remove () не будет работать, насколько я могу видеть, потому что мне нужно удалить несколько вещей одновременно. Также предположим, что невозможно определить, какие элементы удалить «на лету», но можно написать методsetOfElementsToRemove(), В моем конкретном случае потребовалось бы много памяти и времени на обработку, чтобы определить, что удалить во время итерации. Копирование также невозможно из-за ограничений памяти.

setOfElementsToRemove() сгенерирует некоторый набор экземпляров SomeClass, которые я хочу удалить, иfillSet(set) заполнит набор записями.

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

Set<SomeClass> set = new HashSet<SomeClass>();
Set<SomeClass> outputSet = new HashSet<SomeClass>();
fillSet(set);
while (!set.isEmpty()) {
    Iterator<SomeClass> it = set.iterator();
    SomeClass instance = it.next();
    outputSet.add(instance);
    set.removeAll(setOfElementsToRemoveIncludingThePassedValue(instance));
}

setOfElementsToRemoveIncludingThePassedValue() сгенерирует набор элементов для удаления, который включает значение, переданное ему. Нам нужно удалить переданное значение такset будет пустым.

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

Кроме того, я подумал, что опубликую свое решение, потому что, похоже, есть необходимость, и я хотел предоставить отличный ресурс - переполнение стека.

Ответы на вопрос(9)

Ваш ответ на вопрос