我正在迭代一个JRE Collection,它强制执行fail-fast迭代器概念.问题是如果对象满足条件,我需要删除对象的逻辑伙伴.从而防止合作伙伴被处理.有人可以为此建议更好的收集类型吗?
例.
myCollection<BusinessObject>
for (BusinessObject anObject : myCollection)
{
if (someConditionIsTrue)
{
myCollection.remove(anObjectsPartner); // throws ConcurrentModificationException
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
这不是系列的错,它是你使用它的方式.在迭代中途修改集合会导致此错误(这是一件好事,因为迭代通常无法明确地继续).
编辑:重新阅读问题后,这种方法将无效,但我将其留在这里作为一般情况下如何避免此问题的示例.
你想要的是这样的:
for (Iterator<BusinessObject> iter = myCollection.iterator; iter.hasNext(); )
{
BusinessObject anObject = iter.next();
if (someConditionIsTrue)
{
iter.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你通过迭代器本身删除对象,它就会知道删除对象,一切都按照你的预期运行.请注意,虽然我认为所有标准集合在这方面都运行良好,但迭代器不需要实现remove()方法,因此如果您无法控制类myCollection(以及返回迭代器的实现类),您可能需要在那里进行更多的安全检查.
另一种方法(例如,如果您不能保证迭代器支持remove()并且您需要此功能)是创建要迭代的集合的副本,然后从原始集合中删除元素.
编辑:你可以使用后一种技术来实现你想要的,但是你最终还是会回到迭代器首先抛出异常的原因:如果你删除了一个没有的元素,迭代应该做什么到了吗?删除(或不删除)当前元素是相对明确定义的,但是你谈到删除当前元素的伙伴,我认为它可以在迭代中的随机点.由于没有明确的方法可以处理这个问题,因此您需要自己提供某种形式的逻辑来应对这种情况.在这种情况下,我倾向于在迭代期间创建和填充新集合,然后myCollection在结尾处将其分配给变量.如果这是不可能的,那么跟踪要删除和调用的伙伴元素myCollection.removeAll将是最佳选择.
| 归档时间: |
|
| 查看次数: |
1710 次 |
| 最近记录: |