我希望可以在遍历集合时删除多个元素。最初,我认为迭代器足够智能以使下面的简单解决方案起作用。
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做出贡献。