在java中迭代集合时从集合中删除项目

2024-04-29

我希望能够在迭代集合时从集合中删除多个元素。最初,我希望迭代器足够聪明,能够让下面的简单解决方案发挥作用。

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 这一优秀资源。


通常,当您在循环遍历集合时从集合中删除元素时,您会得到一个并发修改异常 http://java.sun.com/javase/6/docs/api/java/util/ConcurrentModificationException.html。这就是为什么Iterator http://java.sun.com/javase/6/docs/api/java/util/Iterator.html接口有一个remove()方法。使用迭代器是在遍历元素集合时修改元素集合的唯一安全方法。

代码会是这样的:

Set<SomeClass> set = new HashSet<SomeClass>();
fillSet(set);
Iterator<SomeClass> setIterator = set.iterator();
while (setIterator.hasNext()) {
    SomeClass currentElement = setIterator.next();
    if (setOfElementsToRemove(currentElement).size() > 0) {
        setIterator.remove();
    }
}

这样您就可以安全地删除从 setOfElementsToRemove() 中生成删除集的所有元素。

EDIT

根据对另一个答案的评论,这可能更符合您的需求:

Set<SomeClass> set = new HashSet<SomeClass>();
Set<SomeClass> removalSet = new HashSet<SomeClass>();
fillSet(set);

for (SomeClass currentElement : set) {
    removalSet.addAll(setOfElementsToRemove(currentElement);
}

set.removeAll(removalSet);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java中迭代集合时从集合中删除项目 的相关文章

随机推荐