我希望能够在迭代集合时从集合中删除多个元素。最初,我希望迭代器足够聪明,能够让下面的简单解决方案发挥作用。
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 这一优秀资源。