3

我有一个 for 循环

      for (int neighbour : neighbours) {

我可以neighbours在循环内修改的地方。发现这就是原因ConcurrentModificationException。并从https://stackoverflow.com/a/8189527/292291阅读

因此,如果您想修改列表(或一般的任何集合),请 使用 iterator,因为它知道修改,因此将正确处理这些修改。

所以我尝试了:

neighboursItr = neighbours.iterator();
while (neighboursItr.hasNext()) {
  // try disconnecting vertices
  neighbour = neighboursItr.next();

但这并不能解决问题。为什么?

4

4 回答 4

11

你在打电话neightbours.remove(neighbour)吗?在这种情况下,这就是问题所在。你需要打电话neightboursItr.remove()

于 2012-09-24T09:51:53.270 回答
1

您是否考虑过创建HashSet具有所需状态的新产品?我的意思是你可以遍历neighbours并添加newNeighbours任何你想要的东西。

于 2012-09-24T09:52:26.697 回答
1

在对集合进行迭代时,您只能使用迭代器的方法修改集合。因此,您可以调用,但不能使用例如neighboursItr.remove()向集合添加元素。neighbours.add()

于 2012-09-24T09:52:32.927 回答
1

迭代时不能修改集合。唯一的例外是使用iterator.remove()方法(如果目标集合支持它)。

原因是这就是迭代器的工作方式。它必须知道如何跳转到集合的下一个元素。如果在创建迭代器后更改集合,则无法执行此操作并引发异常。

这个问题有几种解决方案。例如,如果您想在迭代期间将元素添加到现有集合中,您可以创建另一个集合来存储新元素,然后在迭代完成后添加所有这些元素。

于 2012-09-24T09:56:33.047 回答