Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,对组成有向图的节点的ArrayList执行深度复制_Java_Arrays_Arraylist_Graph - Fatal编程技术网

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());
 }