2013-02-26 141 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

如果性能對您的代碼並不重要,請在一個循環中訪問相鄰節點(不要從相鄰列表中刪除任何節點),並在另一個循環中刪除節點(已添加到鄰居列表中)相鄰列表。