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(); 
    } 
} 
+0

您是否需要迭代器在第一次匹配后继续删除更多元素?或者你只是想删除第一场比赛? – Joffutt4

+0

只是第一场比赛,它只发生一次。 – Funnythat

+1

你基本上会得到这个异常,因为你会混淆可能导致难以发现错误的迭代器。因此,你必须只用迭代器来完成,或者收集要删除的块,然后在循环之后删除它们(例如,使用'blocks.removeAll(blocksToRemove)')。 - 但是,这听起来像某种游戏,所以设计可能不适合,即不使用链接块,您可能更适合使用不同的结构。 – Thomas

如果您只需要删除第一场比赛,那么最简单的解决办法是通过列表进行迭代,找到第一个匹配并保存匹配的,可以的外部访问的变量迭代器循环。然后只是跳出循环,并执行所需的清理(删除)

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