【问题标题】:Creating a deep copy of a multi-level list?创建多级列表的深层副本?
【发布时间】:2019-11-02 21:10:05
【问题描述】:

我有:

ArrayList<ArrayList<ArrayList<Task>>> optimalPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

我想创建一个最优化路径的深层副本。副本本身不应包含对最佳路径的任何引用。下面的代码能用吗?

ArrayList<ArrayList<ArrayList<Task>>> altPaths = new ArrayList<ArrayList<ArrayList<Task>>>();

for (ArrayList<ArrayList<Task>> e : optimalPaths){
    altPaths.add((ArrayList<ArrayList<Task>>) e.clone()); // Create deep copy of optimalPaths
}

我不确定在 altPaths 中是否仍然存在某个级别的引用。

【问题讨论】:

  • clone 的文档:返回此 ArrayList 实例的 shallow 副本。 (元素本身不会被复制。)

标签: java deep-copy


【解决方案1】:

你可以自己做

for (ArrayList<ArrayList<Task>> outer : optimalPaths) {
    ArrayList<ArrayList<Task>> newOuter = new ArrayList<>();
    for (ArrayList<Task> inner : outer) {
        ArrayList<Task> newInner = new ArrayList<>();
        for (Task task: inner) {
            newInner.add((Task) task.clone());
        }
        newOuter.add(newInner);
    }
    altPaths.add(newOuter);
}

【讨论】:

  • 谢谢!您添加内部级别的方法正是我想要弄清楚的。
  • @Tireless 小心clone方法实现,类实现Cloneable
  • 还请注意,此解决方案正在为每个 位置 创建一个新的列表/任务实例,无论是否重复相应的原始实例(相同的任务或列表保存在不同的 职位)
  • @CarlosHeuberger 这是一个基本的深拷贝是的
  • @azro 结果最终将拥有比原始更多的实例(如果原始包含具有相同实例的多个条目)
【解决方案2】:

如果Task类没有你想复制的临时字段,你可以通过序列化和反序列化使用复制:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(optimalPaths);

ByteArrayInputStream bis = new   ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
ArrayList<ArrayList<ArrayList<Task>>> copied = (ArrayList<ArrayList<ArrayList<Task>>>) in.readObject();

或使用外部类来做到这一点:SerializationUtils from Apache Commons

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2023-03-05
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多