【发布时间】:2010-12-13 02:24:57
【问题描述】:
我希望能够在迭代集合时从集合中移除多个元素。最初我希望迭代器足够聪明,让下面的天真的解决方案能够工作。
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 的优秀资源。
【问题讨论】:
-
如何使用'next'来确定要删除的元素?它可以帮助提供更好的答案。
-
从这个问题和下面的答案中可以学到很多东西。
标签: java collections set