复制初始图表

时间:2013-02-26 15:03:52

标签: java graph

我想将我复制到另一个图表中,以便修改新图表不会影响初始图表。我知道我是通过价值传递来做的,但是我该怎么做才能避免这种情况呢?

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;
}

4 个答案:

答案 0 :(得分:1)

您的代码看起来不错,除了:

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

您还需要复制顶点,类似于图形副本。 复制图形并使用相同的顶点不会生成真实副本。

答案 1 :(得分:0)

只要正确实现了Graph的复制构造函数,initialGraph已经是传递给该函数的参数的副本,因为您通过复制传递了此参数。

我无法想象这是如何起作用的:

Graph newGraph = new Graph();

new Graph()会返回指向图表的指针,而不是图表。

答案 2 :(得分: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;
    }
}

答案 3 :(得分:-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;

然而,要记住,解决方案将具有高内存和如果图形太大,计算复杂度。丢弃中间反转图将改善解决方案。