我想将我复制到另一个图表中,以便修改新图表不会影响初始图表。我知道我是通过价值传递来做的,但是我该怎么做才能避免这种情况呢?
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 :(得分: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;
然而,要记住,解决方案将具有高内存和如果图形太大,计算复杂度。丢弃中间反转图将改善解决方案。