0

我的图表保留了一组顶点,每个顶点都有数字、相邻顶点的列表以及是否访问过的指示符。我的代码必须反转图形的边缘,但它会抛出 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);
    }
4

3 回答 3

0

因为您正在迭代顶点列表并同时修改它

于 2013-02-26T09:56:42.480 回答
0

使用 for-each 循环,您不能在迭代时修改集合。

考虑显式使用迭代器。假设您的迭代器支持 remove() 操作(检查它),这应该工作:

Iterator<Vertex> it = initialV.getAdjacent().iterator();
while (it.hasNext()) {
    if (...)
        it.remove();
}

但是,我的回答仅涉及循环的技术性。您应该确保您的反转逻辑正确并保持数据结构一致。

于 2013-02-26T10:06:44.673 回答
0

如果性能对您的代码不重要,请在一个循环中访问相邻节点(不要从相邻列表中删除任何节点),然后在另一个循环中从相邻列表中删除节点(已添加到邻居列表中)。

于 2013-02-28T09:05:19.677 回答