Java Graph(结构)深层复制

时间:2013-09-24 20:00:16

标签: java structure deep-copy

好吧,我有一些类(Vertex),其中包含HashSet;在某些时候,我需要深刻复制该元素;

我写了一些代码,但有时它不起作用;我正在研究这个bug好几天而无法解决它...如果有人有足够的时间阅读代码并找到它,我将非常感激。提前谢谢。

嗯,这是功能:

public Vertex getCopy(Vertex copyFrom, Vertex copyTo, HashSet<Vertex> created){

    copyTo.setId(copyFrom.getId());
    copyTo.setColor(copyFrom.getColor());
    copyTo.setCount(copyFrom.getCount());
    copyTo.setDepth(copyFrom.getDepth());
    copyTo.setDistance(copyFrom.getDistance());
    copyTo.setHeurist(copyFrom.getHeurist());
    copyTo.setVisited(copyFrom.isVisited());
    copyTo.setPath(copyFrom.getPath());

    created.add(copyTo);

    HashSet<Vertex> copyToNeighs = new HashSet<Vertex>();
    HashSet<Vertex> copyFromNeighs = new HashSet<Vertex>();
    copyFromNeighs.addAll(copyFrom.getNeighbours());

    Iterator<Vertex> it = copyFromNeighs.iterator();

    while (it.hasNext()){
        Vertex curr = it.next();

        if (!created.contains(curr)){
            Vertex newOne = new Vertex();
            newOne = getCopy(curr, newOne, created);
            copyToNeighs.add(newOne);
        } else {
            Iterator<Vertex> itr = created.iterator();
            while (itr.hasNext()){
                Vertex tmp = itr.next();
                if (tmp.equals(curr)){
                    copyToNeighs.add(tmp);
                    break;
                }
            }

        }
    }

    copyTo.setNeighbours(copyToNeighs);

    return copyTo;
}

我希望这种方法从CopyFrom复制到CopyTo。 这是我如何称呼这种方法:

Vertex newOne = new Vertex();
Vertex newCurr = new Vertex();
HashSet<Vertex> seen1 = new HashSet<Vertex>();
HashSet<Vertex> seen2 = new HashSet<Vertex>();
newOne = newOne.getCopy(tmp, newOne, seen1);
newCurr = newCurr.getCopy(curr, newCurr, seen2);

其他方法(如.getNEighbours(),. addNeighbours())正常工作,我已经测试了数百次;

3 个答案:

答案 0 :(得分:1)

created是错误的概念。 “from”图中有一组节点,您在“to”图中创建了一组 new 节点。 created.add(copyTo)将从“到”图表添加一个新节点到集合。但是当您通过created.iterator查看节点是否已经存在时,您正在寻找copyFromNeighs中的节点,该节点是“from”图中的节点。在我看来,这将永远不会成功。否则结果将是“to”图中的节点指向“from”图中的节点。

基本上,我认为您需要created成为HashMap<Vertex,Vertex>,而不是一套。 HashMap的“密钥”将是“from”图中的节点,“value”将是“to”图中的对应节点。然后,当您查看“from”节点的邻居时,您将从映射中获取相应的“to”节点(如果它已被复制),并将其添加到新创建的“to”节点的邻居中。

答案 1 :(得分:0)

创建深层副本的最简单方法是序列化到内存中然后反序列化,请参阅以下问题:How do you make a deep copy of an object in Java?

答案 2 :(得分:0)

您需要更一致的方法将源顶点映射到结果顶点。将created声明为hashmap,而不是hashset。仅在created.get(oldVertex)==null时创建新顶点。