Java图形(结构)深度复制

Java图形(结构)深度复制,java,structure,deep-copy,Java,Structure,Deep Copy,我有一些类(顶点),其中包含哈希集;在某个时刻,我需要深度复制那个元素 我写了一些代码,但有时不起作用;我正在处理这个bug好几天了,但无法修复它。。。如果有人有足够的时间阅读代码并找到它,我将非常感激。先谢谢你 这是函数: public Vertex getCopy(Vertex copyFrom, Vertex copyTo, HashSet<Vertex> created){ copyTo.setId(copyFrom.getId()); copyTo.set

我有一些类(顶点),其中包含哈希集;在某个时刻,我需要深度复制那个元素

我写了一些代码,但有时不起作用;我正在处理这个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;
}
public Vertex getCopy(创建顶点复制自、顶点复制到、散列集){
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());
创建。添加(复制到);
HashSet copyToNeighs=新HashSet();
HashSet copyFromNeighs=新HashSet();
copyFromNeighs.addAll(copyFrom.getNeights());
Iterator it=copyFromNeighs.Iterator();
while(it.hasNext()){
顶点curr=it.next();
如果(!created.contains(curr)){
顶点newOne=新顶点();
newOne=getCopy(curr,newOne,created);
copyToNeighs.add(newOne);
}否则{
迭代器itr=created.Iterator();
while(itr.hasNext()){
顶点tmp=itr.next();
如果(tmp等于(当前)){
copyToNeighs.add(tmp);
打破
}
}
}
}
copyTo.setneights(copytoneights);
返回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);
Vertex newOne=新顶点();
顶点newCurr=新顶点();
HashSet seen1=新HashSet();
HashSet seen2=新HashSet();
newOne=newOne.getCopy(tmp,newOne,参见n1);
newCurr=newCurr.getCopy(curr,newCurr,参见n2);

其他方法(如.getNeights(),.addNeights())工作正常,我已经对它们进行了数百次测试

创建深度副本的最简单方法是序列化到内存中,然后反序列化,请参见此问题:

创建深度副本的最简单方法是序列化到内存中,然后反序列化,请参见此问题:

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

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

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


基本上,我认为您需要创建一个
HashMap
,而不是一个集合。HashMap的“键”将是“from”图中的一个节点,“value”将是“to”图中的对应节点。然后,当您查看“from”节点的邻居时,您会从映射中获得相应的“to”节点(如果它已被复制),并将其添加到新创建的“to”节点的邻居中

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


基本上,我认为您需要创建一个
HashMap
,而不是一个集合。HashMap的“键”将是“from”图中的一个节点,“value”将是“to”图中的对应节点。然后,当您查看“from”节点的邻居时,您会从映射中获得相应的“to”节点(如果它已被复制),并将其添加到新创建的“to”节点的邻居中

我忘了说,Vertex.id总是唯一的,所以我重写了Vertex的哈希函数:@Override public int hashCode(){return this.id;}要复制单个顶点还是整个图?你说“不工作”是什么意思?我需要整个图表。我的意思是,在某些情况下,复制的不是完全复制的。某些邻居具有不同的值…您是否覆盖了
顶点的
equals
方法?如果是,它会做什么?我忘了说,Vertex.id总是唯一的,所以我重写了Vertex的hash函数:@Override public int hashCode(){return this.id;}要复制单个顶点还是整个图?你说“不工作”是什么意思?我需要整个图表。我的意思是,在某些情况下,复制的不是完全复制的。某些邻居具有不同的值…您是否覆盖了
顶点的
equals
方法?如果是,它有什么作用?