2013-02-26 97 views
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); 
    } 

回答

0

因为你是遍历顶点列表,并在同一时间对矫正它

+0

我该如何解决? – user2081119 2013-02-26 10:03:08

+0

试着避免在迭代它时及时修改集合。 – 2013-02-26 10:07:54

0

使用for-each循环,当你重复它,你不能修改的集合。

考虑明确使用Iterator。假设你的迭代器支持remove()操作(检查),这应该工作:

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

然而,我的反应只能是指循环的技术性。你应该确保你的反转逻辑是正确的,并保持数据结构的一致性。

0

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