0

Class Foo と言う2つのクラスがあり、 Class Boo.Foo クラスには Boo クラスの配列リストが含まれています。Foo クラスのディープ コピーを作成する必要があり、Foo 自体の配列リストを作成しています。どうすればこれを達成できますか。

        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.

ここで、Foovar 内のオブジェクトのディープコピーとなるように、Foo 型の ArrayList foovar1 を作成したいと考えています。つまり、x の削除や要素の追加など、foovar の boo オブジェクトを変更した場合、foovar1 にアクセスしたときに反映されるべきではありません。

ディープ コピーが打ちのめされていることは知っていますが、これを行う方法を説明している記事を実際に見つけることができませんでした。誰かがコードの使い方を教えてくれませんか?

編集:

言及されたコメントの1つのように、Foo内にコピーコンストラクターを作成しようとしていますが、Fooのコンストラクターを介してBoo配列リストを別の配列リストにコピーする方法について本当に途方に暮れています。arraylist 内の 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) の配列をループして、それらを 1 つずつ新しい配列にコピーできます。そのためのメソッドを定義できます。

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 に答える