Как скопировать элементы из ArrayList в другой, НЕ по ссылке?

java arraylist constructor pass-by-value

4476 просмотра

3 ответа

Я пытаюсь скопировать каждый элемент из одного ArrayList (av) в другой (copia). Дело в том, что они копируются по ссылке, поэтому, когда я делаю какие-либо изменения в оригинале, копия также модифицируется. Конечно, такое поведение никому не нужно. Как мне написать этот метод?

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.

Автор: Ezequiel Berto Источник Размещён: 12.11.2019 09:28

Ответы (3)


10 плюса

Решение

То, что вы хотите, это глубокая копия. Если ваш объект содержит только примитив, вы можете использовать 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)));
        }

Также читайте здесь - как ты делаешь глубокую копию объекта в Java

Автор: Mangat Rai Modi Размещён: 30.12.2016 06:33

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;
}
}
Автор: Faraz Размещён: 30.12.2016 06:32

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);
   });
}
Автор: Nikita Mantri Размещён: 30.12.2016 07:29
Вопросы из категории :
32x32