在 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)
搜索Stack Overflow后,我无法找到解决此问题的好方法,但是几个小时后,我意识到以下内容可以完成这项工作。
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
我的问题是,是否有人有更好的方法来做到这一点,或者是否有支持这些删除的收集操作。
另外,我想我会发布我的解决方案,因为似乎有需求,我想贡献优秀的资源Stack Overflow。