亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于list.clear()問題,具體情況請看下面!

關于list.clear()問題,具體情況請看下面!

森林海 2021-08-25 19:15:08
while((timeSequence+j)!=(traindatas.size())){ArrayList<String> tempData = new ArrayList<>();// if(tempData.size()>0){// tempData.clear();//// }for (int i = j; i < timeSequence+j+1; i++) {tempData.add(String.valueOf(traindatas.get(i).get(preClass)));}j++;System.out.println(tempData);trainDatas.add(tempData);}注釋掉的語句和上面那句的區別?為什么用注釋的語句時trainDatas一直得到的是最后的tempData,
查看完整描述

2 回答

?
慕姐4208626

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



查看完整回答
反對 回復 2021-08-30
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

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

查看完整回答
反對 回復 2021-08-30
  • 2 回答
  • 0 關注
  • 328 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號