4 回答

TA貢獻1818條經驗 獲得超7個贊
不管你是否調用temp.clear(),如果你li多次添加對同一個List對象的引用,li將包含對同一個List對象的多個引用,這意味著li.get(0) == li.get(1),,li.get(0) == li.get(2)等等......
對這些內部之一進行更改List將反映在所有其他內部List,因為只有一個List被多次引用。
因此,在循環的每次迭代中(在將其添加到 之前)分配一個新ArrayList實例是正確的做法。templi
List不過,我會做一些小小的改變 - 在將新的內部添加到外部之前創建新的內部List:
for (int i = 0; i < AList.size(); i++){
for(int j =i+1; j < AList.size(); j++){
List<Integer> temp = new ArrayList<>();
temp.add(AList.get(i));
temp.add(AList.get(j));
li.add(temp);
}
}

TA貢獻1816條經驗 獲得超6個贊
添加元素li
不會生成副本。因此,當您調用時,clear()
您將擁有兩個指向同一個對象的temp
元素和其中的一個元素。li
您可能只想temp
在內循環中進行聲明,這樣您每次都會得到一個新的循環,而無需調用clear()
.

TA貢獻1883條經驗 獲得超3個贊
當您調用.clear()
(或任何其他與此相關的方法)時,您正在對相同的引用進行操作。temp
在這里,如果您不在每次迭代中創建新列表,則會將 by引用的列表添加到li
。當您調用 時clear()
,它們“全部”被清除,因為它們都指向同一個對象。當您每次迭代創建一個新列表時,您將擁有不同的對象,并且可以獨立地對它們進行操作。

TA貢獻1806條經驗 獲得超8個贊
嘗試這樣做:
public static int getTheSubseq(List<Integer> AList){
// int[][] subsequences = new int[][];
List<List<Integer>> li = new ArrayList<>();
List<Integer> temp;
for (int i = 0; i < AList.size(); i++){
for(int j =i+1; j < AList.size(); j++){
temp = new ArrayList<>();
temp.add(AList.get(i));
temp.add(AList.get(j));
li.add(temp);
}
}
System.out.println(li);
return 1;
}
添加回答
舉報