将 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
我有 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