我正在尝试通过数组列表使用foreach循环,但是当我使用它时,它会给我带来错误,但是当我使用普通的for循环时,它可以正常工作,这可能是什么问题?代码在这里:for (Pair p2 : R) { if ((p2.getFirstElm() == p.getSecondElm()) && (p2.getFirstElm() != p2.getSecondElm())) R.add(new Pair (p.getFirstElm(), p2.getSecondElm())); else if ((p2.getSecondElm() == p.getFirstElm()) && (p2.getFirstElm() != p2.getSecondElm())) R.add(new Pair (p2.getFirstElm(), p.getSecondElm())); // else // There are no transitive pairs in R.}这是无效的循环,这是有效的循环:for (int i = 0; i < R.size(); i++) { if ((R.get(i).getFirstElm() == p.getSecondElm()) && (R.get(i).getFirstElm() != R.get(i).getSecondElm())) R.add(new Pair (p.getFirstElm(), R.get(i).getSecondElm())); else if ((R.get(i).getSecondElm() == p.getFirstElm()) && (R.get(i).getFirstElm() != R.get(i).getSecondElm())) R.add(new Pair (R.get(i).getFirstElm(), p.getSecondElm())); //else // There are no transitive pairs in R.}使用foreach循环时出现的错误是:Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at set.problem.fourth.PoSet.makeTransitive(PoSet.java:145) at set.problem.fourth.PoSet.addToR(PoSet.java:87) at set.problem.fourth.PoSetDriver.typicalTesting(PoSetDriver.java:35) at set.problem.fourth.PoSetDriver.main(PoSetDriver.java:13)
3 回答

长风秋雁
TA贡献1757条经验 获得超7个赞
引擎盖下,该for-each循环在Java使用的Iterator用于遍历集合(请参阅本文章进行了详细说明。)和迭代器都将抛出ConcurrentModificationException,如果你修改集合在遍历它,看到这个帖子。

倚天杖
TA贡献1828条经验 获得超3个赞
问题是您正在循环的第一行中执行R.add()。
在第一种情况下,您需要向arraylist打开一个迭代器。当您执行添加操作然后尝试再次进行迭代时,迭代器会注意到您下面的数据结构已更改。
对于for look,每次添加一个新元素都不会出现并发修改问题,尽管随着添加更多元素而大小会发生变化。
要解决此问题,您可能需要添加到一个临时位置,然后在循环后添加该位置,或者制作一份初始数据的副本并添加到原始位置。
添加回答
举报
0/150
提交
取消