[英]JAVA, list of lists
我有列表和列表列表:
ArrayList<String> singleList = new ArrayList<String>();
ArrayList<ArrayList<String>> listOfLists = new ArrayList<ArrayList<String>>();
我不明白這些列表的行為。 我決定給你一個簡單的例子:
listOfLists.clear();
singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);
singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);
singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);
for(int x = 0; x < listOfLists.size(); x++)
{
for(int z = 0; z < singleList.size(); z++)
{
System.out.print(listOfLists.get(x).get(z));
System.out.print(" ");
}
System.out.println("");
}
我得到的結果是:
GHIGHIGHI
代替:
ABCDEFGHI
我的想法出在哪里? 如何獲得上述結果?
對象始終作為Java中的引用傳遞。
將singleList
添加到listOfLists
,實際上是在添加對singleList
的引用 。 由於你已經添加了3次,你得到了singleList
的當前值,重復了3次。
singleList
的“先前值”無處存儲,因此ABC
和DEF
丟失。
您需要使用new ArrayList<String>(singleList)
制作列表的副本。 然后,將此副本添加到listOfLists
。
問題是對象引用如何工作。 一步一步走
singleList.clear();
singleList.add("A");
singleList.add("B");
singleList.add("C");
listOfLists.add(singleList);
//singleList -> A, B, C
//listOfLists -> singleList
singleList.clear();
singleList.add("D");
singleList.add("E");
singleList.add("F");
listOfLists.add(singleList);
//singleList -> D, E, F
//listOfLists -> singleList, singleList
singleList.clear();
singleList.add("G");
singleList.add("H");
singleList.add("I");
listOfLists.add(singleList);
//singleList -> G, H, I
//listOfLists -> singleList, singleList, singleList
現在,您正在打印listOfLists,它包含3次singleList。 但是singleList現在包含G,H,I
要獲得所需的結果,您需要使用不同的列表,一個是A,B,C,另一個是D,E,F,另一個是G,H,I。
singleList1 -> A, B, C
singleList2 -> D, E, F
singleList3 -> F, G, H
listOfLists -> singleList1, singleList2, singleList3
您可以在添加到listOfLists時執行此操作,而不是為singleList提供不同的變量:listOfLists.add(new ArrayList(singleList));
這會創建一個具有不同內存位置的單個列表的副本,這與您引用相同位置的內存位置不同。
要創建列表列表,可以輕松使用ArrayList<ArrayList<Integer>> listOfLists = new ArrayList<ArrayList<Integer>>;
制作整數列表的列表,或用String
或任何你想要的東西替換Integer
。 要訪問項目,請使用listOfLists.get(0).get(0)
,例如,獲取listOfLists
第一個列表的第一項。 不確定這是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.