好吧,我有一些类(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())正常工作,我已经测试了数百次;
答案 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
时创建新顶点。