1

Map<E,Pair<V>>エッジが、頂点が である有向グラフがあります<V>

このグラフのコピーを作成し、元のグラフは変更せずにコピーに変更を加えたいと考えています。

copy1 と copy2 という 2 つの異なるコピー関数を作成しました。2 番目の関数は問題なく動作しますが、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);
        }
    }
4

1 に答える 1

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;
}
于 2013-05-17T11:45:09.243 に答える