2016-04-06 7 views
-1

私はまた私がarray2.clear()をきれいにし、配列1から1を必要なすべてのものは、配列2に追加する前に、私は、チェックしないデフォルトboolean check = false;2つのArrayListを作成するには、別々の変更がありますか?

を持つ2つのArrayList、Itemクラスで

ArrayList<Item> array1 = new ArrayList<>(); 
// and 
ArrayList<Item> array2 = new ArrayList<>(); 

を持っている:

array2.clear(); 
for (Item i : array1) { 
     if (.....) { 
       array2.add(i); 
     } 
} 

配列2の場合boolean checkfalseからtrueに変更された場合、配列1でも変更されます。どのようにそれらを別々にしておくと、次回はarray2に要素を追加するブールチェックはtrueとしてコピーされませんか?

+1

具体的な問題を明確にしたり、詳細を追加して必要なものを正確に強調してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明確にする方法については、How to Askページを参照してください。 –

+2

これは 'Item'の問題であるようですが、' ArrayList'の問題ではありません。 –

+0

[pass-by-valueとpass-by-referenceの違いについて]を読むべきです(http://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-値渡し)。 Javaは、値渡しのプリミティブ以外のすべての場合で参照渡しです。 – user3707125

答えて

6

2つのArrayListに同じオブジェクトを追加しています。オブジェクトを分離したい場合は、itemの新しいインスタンスを作成し、それをarray2に追加します。 Itemを作成する際には、すべてのメンバの値を取得して新しいオブジェクトに設定するコンストラクタが必要です。または、Itemオブジェクトを取得してコンストラクタで値を設定するだけでも構いません。

Itemクラス:

public class Item { 

    boolean check = false;  
    //Other members 

    //Copy constructor 
    public Item(Item itemToCopy) { 
     check = itemToCopy.check; 
     // set other members 
    } 
} 

そして本体:

array2.clear(); 
for (Item i : array1) { 
    if (.....) { 
      //Use copy constructor 
      Item newItem = new Item(i)); 
      array2.add(newItem); 
    } 
} 
+1

'clone()'メソッドかコピーコンストラクタのどちらかを実装して使うことをお勧めします。 – Andreas

+0

実際は私は '/ *他のメンバの値を転送する* /'でコンストラクタをコピーすることを意味します。私はそれを知って言及しています、私の答えを改善してくれてありがとう。 –

+2

いいえ、 '新しいアイテム(i.check/*他のメンバーの値を転送する* /) 'はコピーコンストラクタではありません。コピーコンストラクタは、クラス自体と同じ型の単一のパラメータを持つコンストラクタです。つまり、 'new Item(i)'はコピーコンストラクタを呼び出します。 – Andreas

1

あなたは配列2に配列1の要素を追加している - ので、両方の配列は同じ項目への参照を持っています。アイテム2ではなく、アイテム2のコピーをアイテム2に追加する必要があります。

関連する問題