2016-12-30 72 views
0

我試圖從一個ArrayList(AV)到另一個(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

你想要的是深層複製。如果你的對象只包含原始你可以使用克隆(),否則最好的辦法是做手工: -

讓你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的構造函數作爲參數要簡單一些。 –

相關問題