簡體   English   中英

將ArrayList元素組收集到另一個ArrayList中

[英]Collecting ArrayList element groups into another ArrayList

我有Point-s作為建築物的坐標。 我將它們放入一個名為houseList的ArrayList中。

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

當所有房屋都在houseList中時,我將houseList添加到也是ArrayList的cityList中。

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

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

還有更多城市要添加到此cityList中,因此我清除了houseList,以便可以用另一座城市的建築物再次填充它。

但是正如我所看到的,當我清除houseList時,它也會從cityList中刪除元素。

從具有點坐標的建築物中收集城市的正確方法是什么?

不要使用clear()並重新使用該對象。 當您將對象添加到列表時,它不是添加到列表中的對象的副本 ,而只是引用

因此,清除將導致仍指向同一對象的引用顯示清除的對象。 任何新內容將反映在該參考中。

正確的方法是將新列表分配給變量houseList 然后它將是一個不同的對象,舊參考將查看不再更改的舊對象。

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

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

添加它時,應克隆房屋的ArrayList,如下所示:

cityList.add(houseList.clone())

這樣,將創建一個新副本並將其傳遞給city =,而不是對您清除的ArrayList的引用

當您將houseList放入cityList ,它不會進行復制-您實際上並未其放入cityList ,您只是在其中引用了它。

您將一遍又一遍地使用同一列表,因此當您清除它時,所有點都將被刪除。

解決此問題的最簡單方法是為每個houseList創建一個新的空ArrayList ,然后依次將每個添加到cityList

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM