Удаление элементов из коллекции в 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
будет пустым.
Мой вопрос заключается в том, есть ли у кого-нибудь лучший способ сделать это или есть операции по сбору, которые поддерживают такие удаления.
Кроме того, я подумал, что опубликую свое решение, потому что, похоже, есть необходимость, и я хотел предоставить отличный ресурс - переполнение стека.