gpt4 book ai didi

Java,对构成有向图的节点 ArrayList 执行深拷贝

转载 作者:行者123 更新时间:2023-12-01 13:12:23 25 4
gpt4 key购买 nike

我在执行包含 Node 的 Java ArrayList 副本时遇到问题对象。这些Node有一个 HashSet<Edge>Edge指向其他对象 Node ArrayList 中的 s 形成有向图。我需要制作此 ArrayList 的副本,同时维护有向图结构,以便我可以像遍历原始列表一样遍历复制的列表。

问题是我的列表深拷贝不够“深”。当我在方法(如下)中复制数组时, Node 的副本对象仍然指向原始数组中的节点,而不是新数组中的节点。

我如何更改 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;
}

节点

import java.util.ArrayList;
import java.util.HashSet;

public class Node
{
public String name;
public HashSet<Edge> inEdges;
public HashSet<Edge> outEdges;
public ArrayList<String> deps;

public Node(String name, ArrayList<String> deps) {
this.name = name;
inEdges = new HashSet<Edge>();
outEdges = new HashSet<Edge>();

this.deps = deps;
}
public Node addEdge(Node node){
Edge e = new Edge(this, node);
outEdges.add(e);
node.inEdges.add(e);
return this;
}
@Override
public String toString() {
return name;
}

//Used to copy a given node
public Node(Node inNode)
{
this.name = inNode.name;
this.inEdges = (HashSet<Edge>)inNode.inEdges.clone();
this.outEdges = (HashSet<Edge>)inNode.outEdges.clone();
this.deps = inNode.deps;
}
}

边缘

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

最佳答案

重写 Node 和 Edge 中的克隆函数以使用所包含对象的深度克隆 (obj.clone())。例如,对于 Edge,您可以使用

 public Edge clone(){
return new Edge(from.clone(), to.clone());
}

(前提是你给Node提供了克隆功能)。

那么唯一的问题是集合(字符串是不可变的,不需要克隆)。使用 How to clone ArrayList and also clone its contents? 中提供的解决方案。

关于Java,对构成有向图的节点 ArrayList 执行深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com