2013-02-26 30 views
0

我想將我複製到另一個圖形中,以便修改新圖形不會影響初始圖形。我知道我以價值傳遞做事,但我能做些什麼來避免這種情況呢?複製初始圖形

public Graph copyGraph(Graph initialGraph) { 
    Graph newGraph = new Graph(); 
    for(int i = 0; i < initialGraph.getVerticesSize(); i++) { 
     Vertex v2 = initialGraph.getVertices().get(i);   
     newGraph.getVertices().set(i, v2); 
    } 
    return newGraph; 
} 
+0

您不想使用相同的'Vertex',您也需要複製方法或構造函數。 – 2013-02-26 15:05:25

+0

向我們展示瞭如何聲明你的'Graph'和'Vertex'類,'clone()'可能適用於你的情況。 – ogzd 2013-02-26 15:08:05

回答

0

只要圖的拷貝構造函數正確實施,initialGraph已經傳遞給這個函數,你通過通過複製這種說法的論據的一個副本。

我也無法想象這是怎麼工作:

Graph newGraph = new Graph(); 

new Graph()返回指針圖,而不是圖。

1

您的代碼看起來不錯,除了:

Vertex v2 = initialGraph.getVertices().get(i);   
newGraph.getVertices().set(i, copyVertex(v2)); 

你需要複製的頂點也如同你的圖形複製。 複製圖形並使用相同的頂點不會生成真正的副本。

0

我會用clone()方法在這種情況下,爲了不引用相同的對象:

public Graph copyGraph(Graph initialGraph) { 
    Graph newGraph = initialGraph.clone(); 
    for(int i = 0; i < initialGraph.getVerticesSize(); i++) { 
      Vertex v2 = initialGraph.getVertices().get(i).clone();   
      newGraph.getVertices().set(i, v2); 
    } 
    return newGraph; 
} 

如果Vertex包含對其他對象的引用,那麼需要被克隆爲好,這導致deep copying

編輯

你的類應實現Cloneable和支持clone()方法。

public Object clone() { 
    try { 
     return super.clone(); 
    } catch (CloneNotSupportedException e) { 
     return null; 
    } 
} 
+0

謝謝!另一個麻煩 - 它說克隆()方法不可見,所以我不能使用它 – user2081119 2013-02-26 15:20:59

+0

我更新了我的答案 – ogzd 2013-02-26 15:25:27

-1

一個很粗的(但很快)解決方案,以複製的圖形是:

DirectedGraph<String, DefaultEdge> graph = new DefaultDirectedGraph<String, DefaultEdge>(DefaultEdge.class); 
    DirectedGraph<String, DefaultEdge> revGraph = new EdgeReversedGraph<>(graph); 
    DirectedGraph<String, DefaultEdge> graphCopy = new EdgeReversedGraph<>(revGraph); 
    //To reduce the memory complexity 
    revGraph = null; 

然而,要牢記的是,解決辦法有,如果高內存&計算複雜度圖形太大了。捨棄中間反轉圖將改進解決方案。