gpt4 book ai didi

java - 如何在遍历集合时安全地从集合中删除其他元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:17 27 4
gpt4 key购买 nike

我正在迭代 JRE Collection,它强制执行快速失败迭代器概念,因此如果 Collection 将抛出 ConcurrentModificationException在迭代时被修改,而不是通过使用 Iterator.remove() 方法。但是,如果对象满足条件,我需要删除该对象的“逻辑伙伴”。从而防止合作伙伴也被处理。我怎样才能做到这一点?也许为此目的使用更好的集合类型?

例子。

myCollection<BusinessObject>

for (BusinessObject anObject : myCollection)
{
if (someConditionIsTrue)
{
myCollection.remove(anObjectsPartner); // throws ConcurrentModificationException
}
}

谢谢。

最佳答案

这不是 Collection 的错,而是您使用它的方式。在迭代中途修改集合会导致此错误(这是一件好事,因为迭代通常不可能明确地继续)。

编辑:重读问题后,这种方法行不通,但我将其留在这里作为一般情况下如何避免此问题的示例。

你想要的是这样的:

for (Iterator<BusinessObject> iter = myCollection.iterator; iter.hasNext(); )
{
BusinessObject anObject = iter.next();
if (someConditionIsTrue)
{
iter.remove();
}
}

如果您通过 Iterator 本身移除对象,它会知道移除并且一切都按您预期的那样工作。请注意,虽然我认为所有标准集合在这方面都能很好地工作,但迭代器不是必需来实现 remove() 方法,因此如果您无法控制 myCollection 的类(以及返回迭代器的实现类)您可能需要在其中进行更多安全检查。

另一种方法(例如,如果您不能保证迭代器支持 remove() 并且您需要此功能)是创建集合的副本迭代,然后从原始集合中删除元素。

编辑:您或许可以使用后一种技术来实现您想要的,但是您最终还是会回到迭代器首先抛出异常的原因:什么如果您删除尚未到达的元素,迭代应该做什么?删除(或不删除)当前元素的定义相对明确,但是您谈论的是删除当前元素的伙伴,我认为它可能位于可迭代对象中的随机点。由于没有明确的方法来处理这个问题,您需要自己提供某种形式的逻辑来处理这个问题。在这种情况下,我倾向于在迭代期间创建和填充一个新集合,然后在最后将其分配给 myCollection 变量。如果这不可能,那么跟踪要删除的合作伙伴元素并调用 myCollection.removeAll 将是可行的方法。

关于java - 如何在遍历集合时安全地从集合中删除其他元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/911462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com