我目前正沉浸在这个问题中。我在这里读了很多关于ConcurrentModificationException的其他问题,但无法解决我的问题。也许我看不到树有木。我希望你能帮助我。方法是
public void crop(PesNode n) {
for (int ii = n.getPostNodes().size()-1; ii >= 0; ii--) {
for (int i = ii-1; i >= 0; i--) {
PesNode n1=n.getPostNodes().get(i);
PesNode n2=n.getPostNodes().get(ii);
if (n1.getName().equals(n2.getName())) {
boolean merge=true;
for (PesNode node : n1.getPreNodes()) {
if (!n2.getPreNodes().contains(node)) {
merge=false;
}
}
for (PesNode node : n2.getPreNodes()) {
if (!n1.getPreNodes().contains(node)) {
merge=false;
}
}
if (merge) {
//Merge n1 and n2
//for(Iterator<PesArc> itPesArc = n2.getPost().iterator(); itPesArc.hasNext();) { PesArc a = itPesArc.next();
for(PesArc a : n2.getPost()) {
a.setFrom(n1);
n1.getPost().add(a);
}
//for(Iterator<PesArc> itPesArc = n2.getPost().iterator(); itPesArc.hasNext();) { PesArc a = itPesArc.next();
for(PesArc a : n2.getPre()) {
arcs.remove(a);
a.getFrom().getPost().remove(a);
}
//for(Iterator<Integer> it = n2.getCoset().iterator(); it.hasNext();) { int j = it.next();
for (int j : n2.getCoset()) {
if (!n1.getCoset().contains(j)) {
n1.getCoset().add(j);
}
}
nodes.remove(n2);
//n2.getPost().removeIf(Objects::isNull);
//n2.getPre().removeIf(Objects::isNull);
//n2.getCoset().removeIf(Objects::isNull);
i=0;
}
}
}
}
for (PesNode x : n.getPostNodes()) {
crop(x);
}
错误来自于";作物(x(";在末尾并弹出";a.setFrom(n1("我不明白为什么会发生这种情况,因为每个for循环都会在下一个循环开始之前结束。我还尝试使用迭代器代替for循环,但并没有任何解决方案。我做错了什么?
您得到ConcurrentModificationException
是因为您在使用for
运算符时试图删除元素。因此,我认为代码nodes.remove(n2);
中的行可能会导致此异常。您可以使用Iterator或仅收集要在另一个集合中删除的元素,然后将其删除。有关详细信息:https://www.baeldung.com/java-concurrentmodificationexception