将 ArrayList 元素组收集到另一个 ArrayList

Collecting ArrayList element groups into another ArrayList

我有 Point-s 作为建筑物的坐标。 我将它们放入一个名为 houseList.

的 ArrayList 中
ArrayList<Point> houseList = new ArrayList<Point>();

当所有房子都在 houseList 中时,我将 houseList 添加到 cityList 中,它也是一个 ArrayList。

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

.
.
.
cityList.add(houseList);
houseList.clear();

还有更多的城市要添加到这个 cityList,所以我清除了 houseList,这样我就可以用另一个城市的建筑再次填充它。

但正如我所见,当我清除 houseList 时,它也会从 cityList 中删除元素。

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

当你添加它时,你应该克隆房子的ArrayList,像这样:

cityList.add(houseList.clone())

这样,将创建一个新副本并传递给 city=,而不是对您清除的 ArrayList 的引用

不要使用 clear() 并重新使用该对象。当您将对象添加到列表时,添加到列表的不是对象的 copy,而是 reference

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

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

cityList.add(houseList);
houseList = new ArrayList<ArrayList<Point>>();

当您将 houseList 放入 cityList 时,它不会复制 - 您实际上并没有 放入 [=11] =],你刚刚在里面放了一个 reference

您正在一遍又一遍地使用相同列表,因此当您清除它时,您的所有积分都会被删除。

解决此问题的最简单方法是为每个 houseList 创建一个新的空 ArrayList,然后将每个依次添加到您的 cityList

Java 对象与真实对象非常相似。

如果你把水桶装满水。然后把桶放进一个盒子里。然后倒空桶装满牛奶,盒子里就会装满一桶牛奶。

你想要两个不同的桶:一个装水,一个装牛奶。所以,不是清空第一个桶,你需要保持原样,而是取一个 new 并装满牛奶。

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