0

我有两个类,比如 Class Foo , Cl​​ass Boo.Foo 类包含 Boo 类的数组列表。我需要创建 Foo 类的深层副本,并且我正在创建 Foo 本身的arraylist。我怎样才能做到这一点。

        Class Foo{
        ArrayList<Boo> boovar = new ArrayList<Boo>();
        }

        Class Boo{
        int x;
        void add_x(int y)
        {
            x=y;
        }   
        }

         ArrayList<Foo> foovar = new ArrayList<Foo>();


    ..adding elements to foovar.

现在我想创建一个 Foo 类型的 ArrayList foovar1,这样它就是 foovar 中对象的深层副本。即,如果我修改 foovar 中的 boo 对象,例如删除 x 或添加元素,则在我访问 foovar1 时不应反映它。

我知道深度复制已经被打死了,但我真的找不到文章告诉我如何做到这一点。有人可以告诉我如何使用代码吗?

编辑:

我试图在 Foo 中创建一个复制构造函数,就像提到的评论之一,但我真的不知道如何通过 Foo 中的构造函数将 Boo 数组列表复制到另一个。更不用说我将如何在数组列表中循环 Foo 的实例来创建它的副本。任何帮助将非常感激!

4

2 回答 2

1

首先,您需要在 Boo 类中创建一个复制构造函数:

Class Boo{
  int x;

  //copy constructor 
  public Boo (Boo sourceBoo){
    x = sourceBoo.x;
  }

}

使用上述方法,您可以在 Foo 类中创建一个复制构造函数来复制其中包含的 Boos 数组:

Class Foo{
  ArrayList<Boo> boovar = new ArrayList<Boo>();

  //copy constructor
  public Foo(Foo sourceFoo){
    for (Boo aBoo:sourceFoo.boovar){
      boovar.add(new Boo(aBoo)); 
    }
  }

}

现在,您可以遍历您的 Foo(s) 数组并将它们一一复制到一个新数组中。你可以定义一个方法来做到这一点:

public ArrayList<Foo> deepCopyFooList(ArrayList<Foo> sourceArray){
   ArrayList<Foo> targetList = new ArrayList<Foo>();
   for (Foo aFoo:sourceArray){
     targetList.add(new Foo(aFoo));
   }

   return targetList;
}

所以要复制你的数组,你会:

ArrayList<Foo> foovar = new ArrayList<Foo>();
ArrayList<Foo> foovarCopy = deepCopyFooList(foovar);
于 2012-11-22T21:47:46.527 回答
0

编辑:

List<Boo> newCopy = new ArrayList<Boo>(boovar);
newCopy.addAll(boovar);

..如果 boovar 的元素是不可变的。如果没有,您应该使用 Boo 类的 clone() 方法。

于 2012-11-22T21:59:34.677 回答