繁体   English   中英

ArrayList的深层副本 <Arraylist> 在JAVA中

[英]Deep copy of an ArrayList<Arraylist> in JAVA

我检查了其他答案,但找不到正确的答案。 我想创建ArrayList<ArrayList>的副本,因为我需要其他地方的原始副本。 我以不同的方式使用.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复制的内容,这使我不得不使用.get()方法进行for循环。我觉得最后它们基本上是相同的。

您可以简单地使用ArrayList(Collection c)构造函数

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中的元素

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM