2 回答

TA貢獻1852條經(jīng)驗 獲得超7個贊
你的代碼沒有貼完整,不是很明白你要干什么,我推測注釋那幾行代碼之前tempData這個集合是不是在外面定義的(也就是值while循環(huán)之前),如果是這樣的話你每次執(zhí)行trainDatas.add(tempData);添加的都是同一個對象,只是每次循環(huán)都把tempData的內(nèi)容清除了重新添加,所以循環(huán)完了你trainDatas中的所有l(wèi)ist里的內(nèi)容肯定都是一致的,并且是最后一次循環(huán)所添加的內(nèi)容。
針對這個問題很好理解,在List等集合中添加元素時,其實都是添加的元素的引用,當(dāng)元素里的內(nèi)容改變了,集合中加入的元素也會受影響。
例如一下一段代碼,可能你期望輸出是0~4,但你執(zhí)行了發(fā)現(xiàn)輸出了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循環(huán)里面,每次循環(huán)都新創(chuàng)建一個新的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條經(jīng)驗 獲得超8個贊
用ArrayList<String> tempData = new ArrayList<>();的時候,每一次while循環(huán)都是創(chuàng)建了一個新的arraylit對象,他跟其它的對象并沒有任何關(guān)聯(lián),所以每次添加到traindatas時結(jié)果都是不一樣的,但是你注釋掉的語句始終都是同一個對象,只是做了clear,這會導(dǎo)致你traindatas中加入的tempdata,實際上都是同一個東西
添加回答
舉報