在某个计划中,我有HashSet
Foo
:
final Set<Foo> set = new HashSet<>();
// add a lot of elements to the set
class Foo {
public void destroy() {
// other stuff [such as removing this as event handler]
set.remove(this);
}
}
我想为该集的所有成员致电destroy()
。
destroy()
方法的目的是将元素作为事件处理程序和集合删除。
这就是我的尝试:
对每个循环使用Iterator / - 抛出ConcurrentModificationException
:
for (Iterator<Foo> i = set.iterator(); i.hasNext(); ) { i.next().destroy() }
当时删除一个元素 - 可怕的低效率:
while (!set.isEmpty()) { set.iterator().next().destory(); }
我正在寻找这个问题的解决方案,该解决方案适用于集合中的很多元素。非常感谢你。
答案 0 :(得分:2)
你的第一次尝试差不多完成了。
尝试
for (Iterator<Foo> i = set.iterator(); i.hasNext(); ) {
Foo foo = i.next();
// other stuff with foo. Something like foo.someOtherStuff();
i.remove();
}
这将从集合中安全删除。甚至不需要召唤毁灭。