2016-12-30 2 views
0

하나의 ArrayList (av)에서 다른 요소 (copia)로 각 요소를 복사하려고합니다. 문제는 참조로 복사된다는 것이므로 원래의 복사본을 변경하면 복사본도 수정됩니다. 물론,이 행동은 원하지 않습니다. 이 메소드는 어떻게 작성해야합니까? 나는 또한 다음을 시도 :ArrayList의 요소를 참조가 아닌 다른 요소로 복사하는 방법은 무엇입니까?

copia = new ArrayList<Articulo_Venta>(av); 

을하지만 여전히 원래의 ArrayList를 가리키는 요소를 가지고

int codigo; 
String nombre; 
float cantidad; 

PS :

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 다음 필드가 있습니다.

답변

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에서 오버라이드 (override) 할 필요가 있습니다.

이렇게하는 방법입니다.

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를 인자로하는 생성자를 만드는 것은 조금 더 간단합니다. –