我的图形保留一组顶点,每个顶点都有数字,它的相邻顶点的列表,以及它是否被访问过的指示符。我的代码必须反转图形的边缘,但它会抛出CurrentModificationException。有什么问题?
public void reverse() {
Vertex initialVertex = vertices.get(1);
reverseVertex(initialVertex);
}
public void reverseVertex(Vertex initialV) {
initialV.setVisitedForReverse(true);
ArrayList<Vertex> neighbors = new ArrayList<Vertex>();
for( Vertex v : initialV.getAdjacent()) {
if( !v.isVisitedForReverse() ) {
neighbors.add(v);
v.getAdjacent().add(initialV);
initialV.getAdjacent().remove(v);
}
}
for(Vertex vert : neighbors)
reverseVertex(vert);
}
答案 0 :(得分:0)
因为您正在迭代顶点列表并同时修改它
答案 1 :(得分:0)
使用for-each循环,在迭代时无法修改集合。
考虑明确使用Iterator。假设你的迭代器支持remove()操作(检查它),这应该有效:
Iterator<Vertex> it = initialV.getAdjacent().iterator();
while (it.hasNext()) {
if (...)
it.remove();
}
但是,我的回答仅涉及循环的技术性。您应确保您的反转逻辑正确并保持数据结构一致。
答案 2 :(得分:0)
如果性能对您的代码不重要,请访问一个循环中的相邻节点(不要从相邻列表中删除任何节点),并在另一个循环中从相邻节点中删除节点(已添加到邻居列表中)列表。