2016-09-21 195 views
1

我有一個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

回答

1

如果您只需要刪除第一場比賽,那麼最簡單的解決辦法是通過列表進行迭代,找到第一個匹配並保存匹配的,可以的外部訪問的變量迭代器循環。然後只是跳出循環,並執行所需的清理(刪除)

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

相關問題