Estoy tratando de copiar cada elemento de una ArrayList (av) a otra (copia). La cuestión es que se copian por referencia, por lo que cada vez que hago cambios en el original, la copia también se modifica. Por supuesto, este comportamiento no es deseado. ¿Cómo debo escribir este método?

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 tiene estos campos:

int codigo;
String nombre;
float cantidad;

PD: También probé la siguiente:

copia = new ArrayList<Articulo_Venta>(av);

Pero todavía tiene sus elementos apuntando a la ArrayList original.

3
Ezequiel Berto 30 dic. 2016 a las 09:28

3 respuestas

La mejor respuesta

Lo que quieres es la copia profunda. Si su objeto contiene solo primitivo, puede usar clone (), de lo contrario, la mejor manera es hacerlo manualmente: -

Cree un constructor en su clase Articulo_Venta que tome otro objeto Articulo_Venta e inicialice las variables miembro.

Luego cambie el código como: -

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)));
        }

Lea también aquí: how-do- usted-hace-una-copia-profunda-de-un-objeto-en-java

10
Community 23 may. 2017 a las 12:08

Clonando los objetos antes de agregarlos. Por ejemplo, en lugar de newList.addAll(oldList);

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

El clon debe anularse correctamente en Articulo_Venta.

Así es como lo haces.

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;
}
}
1
Faraz 30 dic. 2016 a las 06:46

Crea un nuevo constructor en tu clase 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);
   });
}
1
Nikita Mantri 30 dic. 2016 a las 07:29