【发布时间】:2021-05-20 19:16:47
【问题描述】:
我有课:
public class Node
{
private String id;
private List<Node> children;
}
我需要创建一个 List of it List 的深层副本,但考虑到可能存在循环引用,我正在尝试实现 Cloneable 接口并覆盖 clone 方法,但我不断收到 Stackoverflow 异常,所以我想知道是否有一种方法可以快速进行深度复制并消除过程中的循环依赖?
使用可克隆的类,当我尝试克隆并且它具有循环引用时,我收到错误提示
public class Node implements Cloneable
{
private String id;
private List<Node> children;
@Override
public Object clone() throws CloneNotSupportedException {
Node clone = (Node) super.clone();
if (children != null) {
List<Node> cloneChildren = new ArrayList<>(children.size());
for (Node child : children) {
cloneChildren.add((Node) child.clone());
}
clone.setChildren(cloneChildren);
}
return clone;
}
public List<Node> getChildren() {
return children;
}
public void setChildren(List<Node> children) {
this.children = children;
}
}
【问题讨论】:
-
id是否保证对每个节点都是唯一的?如果是这样,您可以编写一个复制算法来跟踪 id 并在遇到之前看到的 ID 时停止。 -
“我正在尝试实现 Cloneable 接口并覆盖克隆方法,但我不断收到 Stackoverflow 异常”——请将此代码分享为 minimal reproducible example。
-
@NickReed 是的,id 是唯一的
-
嗯,你可以跟踪在递归访问节点时遇到了哪些节点。如果已经遇到该节点,请跳过。例如,
a -> b -> c -> d -> e -> b...
标签: java list recursion circular-dependency circular-reference