2016-12-30 16 views
0

1つのArrayList(av)から別の1つ(copia)に各要素をコピーしようとしています。問題はそれらが参照によってコピーされていることです。元のコピーに変更を加えるたびにコピーも変更されます。もちろん、この動作は望ましくありません。このメソッドをどのように書くべきですか?ArrayListから別のものに要素をコピーするにはどうすればいいですか?

public void copiarArrayList(ArrayList<Articulo_Venta> copia, ArrayList<Articulo_Venta> av){ 
    copia.clear(); 
    for (int i = 0; i < av.size(); i++) { 
     copia.add(av.get(i)); 
    } 
} 

Articulo_Ventaは、これらのフィールドがあります。

int codigo; 
String nombre; 
float cantidad; 

PS:

copia = new ArrayList<Articulo_Venta>(av); 

が、それはまだ元のArrayListを指し、その要素を持っている:私はまた次を試してみました。

答えて

5

はディープコピーです。オブジェクトにプリミティブのみが含まれている場合は、clone()を使用できます。それ以外の場合は、手動で行うのが最も良い方法です。 -

Articulo_Ventaクラスのコンストラクタを作成し、別のArticulo_Ventaオブジェクトを取得してメンバ変数を初期化します。

次にように、コードを変更します - また、ここで読む

public void copiarArrayList(ArrayList<Articulo_Venta> copia, ArrayList<Articulo_Venta> av){ 
     copia.clear(); 
     for (int i = 0; i < av.size(); i++) { 
      copia.add(new Articulo_Venta(av.get(i))); 
     } 

からhow-do-you-make-a-deep-copy-of-an-object-in-java

+0

それでした!これを行う必要はありませんが、オブジェクトの各フィールドを個別に新しいオブジェクトにコピーし、新しいArrayListに追加するのが解決策です。ありがとう、幸せな新年! –

1

オブジェクトを追加する前に複製する。たとえば、代わりのnewList.addAll(oldList);

for(Articulo_Venta av : oldList) { 
    newList.add(av.clone()); 
} 

クローンが正しくArticulo_Ventaでオーバーライドする必要があります。

これはあなたのやり方です。何をしたい

public class Articulo_Venta { 

String a; //assuming you have these fields, then 
Date d; 
... 

public Articulo_Venta clone(){ 
    Articulo_Venta av = new Articulo_Venta(); 
    av.a = this.a.clone(); 
    av.d = this.d.clone(); 
    ... 
    return av; 
} 
} 
+0

しかし、avに他のオブジェクトへの参照が多く含まれていて、それらをすべてコピーしないとどうなりますか? –

+0

Javaのクローンをオーバーライドしないでください。-http://stackoverflow.com/questions/270369/what-have-you-used-object-clone-for –

+0

@MangatRaiModiええ、私はあなたがプリミティブをクローンできないことを知っています。それで私は私の例では何もプリミティブを含まなかったのです:P –

1

をあなたのクラスArticulo_Ventaで新しいコンストラクタを作成します。

public Articulo_Venta(int codigo, String number, float candidad) 
{ 
    this.codigo = codigo; 
    this.number = number; 
    this.candidad = candidad; 
} 

public void copiarArrayList(List<Articulo_Venta> copia, List<Articulo_Venta> av) 
{ 
    av.stream().forEach(t -> { 
    Articulo_Venta newObj = new Articulo_Venta(t.getCodigo(), t.getNumber(), t.getCandidad()); 
    copia.add(newObj); 
    }); 
} 
+0

これもうまくいくでしょうが、引数としてArticulo_Ventaを持つコンストラクタを作るのはちょっと簡単です。 –

関連する問題