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

4 回答 4

1

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

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

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

于 2013-02-26T15:08:39.150 回答
0

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

我也无法想象这是如何工作的:

Graph newGraph = new Graph();

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

于 2013-02-26T15:05:34.330 回答
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;
    }
}
于 2013-02-26T15:12:45.547 回答
-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;

但是,请记住,如果图形太大,该解决方案将具有很高的内存和计算复杂性。丢弃中间反向图将改进解决方案。

于 2016-01-02T19:37:41.580 回答