Java,对组成有向图的节点的ArrayList执行深度复制
我在执行包含Java,对组成有向图的节点的ArrayList执行深度复制,java,arrays,arraylist,graph,Java,Arrays,Arraylist,Graph,我在执行包含节点对象的Java ArrayList副本时遇到问题。这些节点s有一个哈希集的边对象,这些对象指向ArrayList中的其他节点以形成有向图。我需要在保持有向图结构的同时复制此ArrayList,以便能够像遍历原始列表一样遍历复制的列表 问题是我的列表深度不够。在下面的方法中复制数组时,节点对象的副本仍然指向原始数组中的节点,而不是新数组中的节点 如何更改cloneList函数,使其执行数组的深层复制,从而在输出数组中保持有向图结构 public static ArrayList&l
节点
对象的Java ArrayList副本时遇到问题。这些节点
s有一个哈希集
的边
对象,这些对象指向ArrayList中的其他节点
以形成有向图。我需要在保持有向图结构的同时复制此ArrayList,以便能够像遍历原始列表一样遍历复制的列表
问题是我的列表深度不够。在下面的方法中复制数组时,节点
对象的副本仍然指向原始数组中的节点,而不是新数组中的节点
如何更改cloneList
函数,使其执行数组的深层复制,从而在输出数组中保持有向图结构
public static ArrayList<Node> cloneList(ArrayList<Node> inList)
{
ArrayList<Node> clonedList = new ArrayList<Node>(inList.size());
for(Node aNode : inList)
{
clonedList.add(new Node(aNode));
}
return clonedList;
}
重写节点和边缘中的克隆函数,以使用包含对象的深度克隆(
obj.clone()
)。例如,对于Edge
,可以使用
public Edge clone(){
return new Edge(from.clone(), to.clone());
}
(前提是为节点提供克隆功能)
那么唯一的问题就是集合(字符串是不可变的,不需要克隆)。按照中提供的解决方案使用一些东西,因此在这些重写之后,不要使用克隆列表方法中的
新节点(阳极)
do阳极.clone()
?是的。这应该可以做到。这不是我/我们所期望的。我不确定确切的问题。在我的代码中还有其他的解决方法。不过谢谢你的回答,它确实在其他方面帮助了我。
public class Edge
{
public Node from;
public Node to;
public Edge(Node from, Node to) {
this.from = from;
this.to = to;
}
@Override
public boolean equals(Object obj) {
Edge e = (Edge)obj;
return e.from == from && e.to == to;
}
}
public Edge clone(){
return new Edge(from.clone(), to.clone());
}