2 回答

TA貢獻1852條經驗 獲得超7個贊
你的代碼沒有貼完整,不是很明白你要干什么,我推測注釋那幾行代碼之前tempData這個集合是不是在外面定義的(也就是值while循環之前),如果是這樣的話你每次執行trainDatas.add(tempData);添加的都是同一個對象,只是每次循環都把tempData的內容清除了重新添加,所以循環完了你trainDatas中的所有list里的內容肯定都是一致的,并且是最后一次循環所添加的內容。
針對這個問題很好理解,在List等集合中添加元素時,其實都是添加的元素的引用,當元素里的內容改變了,集合中加入的元素也會受影響。
例如一下一段代碼,可能你期望輸出是0~4,但你執行了發現輸出了5個4:
List<List<Integer>> list = new ArrayList<>();
List<Integer> elements = new ArrayList<>();
for (int i = 0; i < 5; i++) {
if (!elements.isEmpty()) {
elements.clear();
}
elements.add(i);
list.add(elements);
}
for (List<Integer> ele : list) {
for (Integer i : ele) {
System.out.print(i + "\t");
}
}
// 輸出 4 4 4 4 4
這和你上面的問題很類似,只需要把List<Integer> elements = new ArrayList<>();放入for循環里面,每次循環都新創建一個新的elements,問題就迎刃而解了。
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
List<Integer> elements = new ArrayList<>();
if (!elements.isEmpty()) {
elements.clear();
}
elements.add(i);
list.add(elements);
}
for (List<Integer> ele : list) {
for (Integer i : ele) {
System.out.print(i + "\t");
}
}
// 輸出 0 1 2 3 4

TA貢獻1854條經驗 獲得超8個贊
用ArrayList<String> tempData = new ArrayList<>();的時候,每一次while循環都是創建了一個新的arraylit對象,他跟其它的對象并沒有任何關聯,所以每次添加到traindatas時結果都是不一樣的,但是你注釋掉的語句始終都是同一個對象,只是做了clear,這會導致你traindatas中加入的tempdata,實際上都是同一個東西
添加回答
舉報