1

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

我写了一些代码,但有时它不起作用;我在这个错误上工作了几天,但无法修复它......如果有人有足够的时间阅读代码并找到它,我将非常感激。先感谢您。

好吧,这是功能:

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())工作正常,我已经测试了数百次;

4

3 回答 3

1

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

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

于 2013-09-24T21:44:33.327 回答
0

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

于 2013-09-24T21:33:54.093 回答
0

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

于 2013-09-24T21:41:46.703 回答