我有一个有向图,边长为Map<E,Pair<V>>
,顶点为<V>
。
我希望获得此图表的副本,并在副本中进行一些更改,而原始图表不会发生变化。
我写了两个不同的复制功能,copy1和copy2。第二个函数工作正常,但是,在copy1中,如果我从复制图中删除一个顶点,它也会从原始顶点删除。你能告诉我copy1的问题是什么吗?我怎样才能快速复制我的图表?
public Graph<V> copy1() {
Graph<V> g = new Graph<V>();
g.vertices.putAll(super.vertices);
g.edges.putAll(super.edges);
return g;
}
public static void copy2(IGraph<E> graph, IGraph<E> copy) {
assert (copy.getVertexCount() == 0);
for (E resource : graph.getVertices()) {
copy.addVertex(resource);
}
for (Edge edge : graph.getEdges()) {
Pair<E> endpoints = graph.getEndpoints(edge);
copy.addEdge(edge, endpoints);
}
}
答案 0 :(得分:1)
使用它作为一种方法,因此它是完美的deepCopy,其中所有对象都是递归创建的
public static <T extends Serializable> T deepCopy(T o) throws Exception
{
if (o == null)
return null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(o);
bos.close();
oos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
T t = (T) ois.readObject();
bis.close();
ois.close();
return t;
}