如何通过引用将元素从 ArrayList 复制到另一个?
How to copy elements from an ArrayList to another one NOT by reference?
我正在尝试将每个元素从一个 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。
在添加之前克隆对象。例如,而不是 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;
}
}
你要的是深拷贝。如果你的对象只包含原语,你可以使用 clone(),否则最好的方法是手动:-
在你的 Articulo_Venta
class 中创建一个构造函数,它接受另一个 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
在 class 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);
});
}
我正在尝试将每个元素从一个 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。
在添加之前克隆对象。例如,而不是 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;
}
}
你要的是深拷贝。如果你的对象只包含原语,你可以使用 clone(),否则最好的方法是手动:-
在你的 Articulo_Venta
class 中创建一个构造函数,它接受另一个 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
在 class 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);
});
}