Java 正在将ArrayList元素组收集到另一个ArrayList中

Java 正在将ArrayList元素组收集到另一个ArrayList中,java,arraylist,point,Java,Arraylist,Point,我用s点表示建筑物的坐标。 我把它们放入一个名为房屋列表的数组列表中 ArrayList<Point> houseList = new ArrayList<Point>(); ArrayList houseList=new ArrayList(); 当所有房屋都在房屋列表中时,我将房屋列表添加到城市列表中,该列表也是一个阵列列表 ArrayList<ArrayList<Point>> cityList = new ArrayList<Ar

我用s点表示建筑物的坐标。 我把它们放入一个名为房屋列表的数组列表中

ArrayList<Point> houseList = new ArrayList<Point>();
ArrayList houseList=new ArrayList();
当所有房屋都在房屋列表中时,我将房屋列表添加到城市列表中,该列表也是一个阵列列表

ArrayList<ArrayList<Point>> cityList = new ArrayList<ArrayList<Point>>();

.
.
.
cityList.add(houseList);
houseList.clear();
ArrayList cityList=new ArrayList();
.
.
.
添加城市列表(房屋列表);
houseList.clear();
有更多的城市要添加到这个城市列表中,所以我清除了房屋列表,这样我可以用另一个城市的建筑再次填充它

但正如我所看到的,当我清除房屋列表时,它也会从城市列表中删除元素


从具有点坐标的建筑物收集城市的正确方法是什么?

添加时,应克隆房屋的阵列列表,如下所示:

cityList.add(houseList.clone())

这样,将创建一个新副本并传递给city=,而不是添加时清除的对ArrayList的引用,您应该克隆房屋的ArrayList,如下所示:

cityList.add(houseList.clone())
这样,将创建一个新副本并传递给city=,而不是对ArrayList的引用,您可以清除该引用,但不要使用
clear()
并重新使用该对象。将对象添加到列表中时,添加到列表中的不是对象的副本,而是引用

因此,清除将导致仍然指向同一对象的引用显示清除的对象。任何新内容都将反映在该参考中

正确的方法是将新列表分配给变量
houseList
。然后它将是一个不同的对象,旧引用将查看不再改变的旧对象

cityList.add(houseList);
houseList = new ArrayList<ArrayList<Point>>();
cityList.add(房屋列表);
houseList=newarraylist();
不要使用
清除()
并重新使用该对象。将对象添加到列表中时,添加到列表中的不是对象的副本,而是引用

因此,清除将导致仍然指向同一对象的引用显示清除的对象。任何新内容都将反映在该参考中

正确的方法是将新列表分配给变量
houseList
。然后它将是一个不同的对象,旧引用将查看不再改变的旧对象

cityList.add(houseList);
houseList = new ArrayList<ArrayList<Point>>();
cityList.add(房屋列表);
houseList=newarraylist();

当你将
房屋列表
放入
城市列表
时,它不会复制-你实际上还没有将它放入
城市列表
,你只是在那里放了一个对它的引用

您一次又一次地使用同一个列表,因此当您清除它时,您的所有点都将被删除


解决这一问题的最简单方法是为每个
房屋列表创建一个新的空
阵列列表
,然后依次将每个列表添加到您的
城市列表
当您将
房屋列表
放入
城市列表
时,它不会复制—您实际上没有将其放入
城市列表
,你刚才在里面提到了它

您一次又一次地使用同一个列表,因此当您清除它时,您的所有点都将被删除


解决此问题的最简单方法是为每个
房屋列表
创建一个新的空
数组列表
,然后依次将每个列表添加到您的
城市列表

如果你把桶装满水。然后把桶放进盒子里。然后清空桶中的牛奶,盒子里会装一桶牛奶

你需要两个不同的桶:一个装水,一个装牛奶。因此,你不需要清空第一个桶,你需要让它保持原样,而是拿一个新的,装满牛奶

cityList.add(houseList); // add the water bucket to the box
houseList = new ArrayList<>(); // get a new bucket
houseList.add(otherHouse); // add milk to the new bucket
cityList.add(houseList); // add the milk bucket to the box
cityList.add(房屋列表);//把水桶加到箱子里
houseList=new ArrayList();//买个新桶
房屋列表。添加(其他房屋);//把牛奶加到新桶里
城市列表。添加(房屋列表);//把牛奶桶加到盒子里

Java对象的工作原理与真实对象非常相似

如果你把桶装满水。然后把桶放进盒子里。然后清空桶中的牛奶,盒子里会装一桶牛奶

你需要两个不同的桶:一个装水,一个装牛奶。因此,你不需要清空第一个桶,你需要让它保持原样,而是拿一个新的,装满牛奶

cityList.add(houseList); // add the water bucket to the box
houseList = new ArrayList<>(); // get a new bucket
houseList.add(otherHouse); // add milk to the new bucket
cityList.add(houseList); // add the milk bucket to the box
cityList.add(房屋列表);//把水桶加到箱子里
houseList=new ArrayList();//买个新桶
房屋列表。添加(其他房屋);//把牛奶加到新桶里
城市列表。添加(房屋列表);//把牛奶桶加到盒子里

强烈反对使用
克隆()
。与其克隆并清除它,为什么不创建一个新的ArrayList?强烈反对使用
克隆()
。与其克隆并清除它,为什么不创建一个新的ArrayList?