Java删除迭代器,删除同一列表中的另一个元素
问题描述:
我有一个ArrayList
被称为块迭代通过使用迭代器。在我调用当前迭代器的.remove()
方法之前,我必须删除链接到被删除对象的列表中的另一个对象。按照预期,尝试执行此操作会导致并发修改异常。你知道我能如何解决这个问题吗?示例代码:Java删除迭代器,删除同一列表中的另一个元素
for (Iterator<Block> iterator = Blocks.iterator(); iterator.hasNext();) {
Block block = (Block) iterator.next();
if (block.getX() == x && block.getY() == y) {
block.remove(); //This removes another block from this list but throws the error
iterator.remove();
}
}
答
如果您只需要删除第一场比赛,那么最简单的解决办法是通过列表进行迭代,找到第一个匹配并保存匹配的,可以的外部访问的变量迭代器循环。然后只是跳出循环,并执行所需的清理(删除)
Block removeMe;
for (Iterator<Block> iterator = Blocks.iterator(); iterator.hasNext();) {
Block block = (Block) iterator.next();
if (block.getX() == x && block.getY() == y) {
removeMe = block;
iterator.remove();
break;
}
}
removeMe.remove();
+0
这就是我从托马斯的评论中得到的,它完美地表达了谢谢! – Funnythat
您是否需要迭代器在第一次匹配后继续删除更多元素?或者你只是想删除第一场比赛? – Joffutt4
只是第一场比赛,它只发生一次。 – Funnythat
你基本上会得到这个异常,因为你会混淆可能导致难以发现错误的迭代器。因此,你必须只用迭代器来完成,或者收集要删除的块,然后在循环之后删除它们(例如,使用'blocks.removeAll(blocksToRemove)')。 - 但是,这听起来像某种游戏,所以设计可能不适合,即不使用链接块,您可能更适合使用不同的结构。 – Thomas