【问题标题】:Deep copy of an ArrayList<Arraylist> in JAVAJAVA 中 ArrayList<Arraylist> 的深拷贝
【发布时间】:2014-03-27 10:29:45
【问题描述】:

我检查了其他答案,但我找不到我的问题的正确答案。 我想创建我的ArrayList&lt;ArrayList&gt; 的副本,因为我需要其他地方的原始副本。我以不同的方式使用了.clone() 方法:

public class WordChecker {

    private ArrayList<ArrayList> copyOfList = new ArrayList<ArrayList>();

    public WordChecker(ArrayList<ArrayList> list) {
        for (int i = 0; i < list.size(); i++)
            for (int j = 0; j < 7; j++)
                copyOfList = (ArrayList<ArrayList>) list.clone(); // without error
                // copyOfList = list.clone();cannot convert from Object to
                // ArrayList<ArrayList>
                // copyOfList = list.get(i).clone();cannot convert from Object to
                // ArrayList<ArrayList>
                // copyOfList = list.get(i).get(j).clone();
    }

但我的主要ArrayList 仍然在我处理它的副本时发生变化。 谁能告诉我在这种情况下我应该如何获得深层副本?

答案: 我将复制机制放在我的类构造函数中:

private ArrayList<List> checkedTags = new ArrayList<List>();
public WordChecker(ArrayList<ArrayList> list)
  {
     for (ArrayList word: list) copyOfList.add((ArrayList) word.clone());

}

唯一的问题是,这不适用于从 ArrayList 复制,这让我经历了一个 for 循环使用 .get() 方法。我觉得它们最后基本相同。

【问题讨论】:

  • 不要使用克隆()。使用将另一个集合作为参数的 ArrayList 构造函数。如果你想要一个深拷贝,你需要循环。
  • 我创建了一个嵌套循环来访问内部 ArrayList 中的每个项目。它抛出代码前面提到的错误。我使用了以下代码:>> for (ArrayList word: list) copyOfList.add(word.clone())... 也是。但它不能接受 .add .

标签: java arraylist deep-copy


【解决方案1】:

你可以简单地使用@987654321@构造函数

public <T> ArrayList<ArrayList<T>> deepCopy(ArrayList<ArrayList<T>> source) {
    ArrayList<ArrayList<T>> dest = new ArrayList<ArrayList<T>>();
    for(ArrayList<T> innerList : source) {
        dest.add(new ArrayList<T>(innerList));
    }
    return dest;
}

注意: 正如@Tim B 所提到的,这不会深度复制 ArrayList 中的元素

【讨论】:

  • 请注意,虽然这会深度复制列表,但不会深度复制列表中的项目。
  • 我编辑了我的帖子。我不太擅长使用泛型方法...:D
  • 如果它不深拷贝列表的元素,那么它不是深拷贝。
  • @Vatsal 我已经在我的回答中提到了这一点。我还有什么遗漏吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多