中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ArrayList在for循環中使用remove方法移除元素方法介紹

發布時間:2020-09-16 06:36:05 來源:腳本之家 閱讀:199 作者:性子有點污 欄目:編程語言

有時候我們需要在一個ArrayList的for循環中動態刪除元素的需求, 廢話不多說看代碼

List<Integer> list = new ArrayList<Integer>(); 
list.add(0); 
list.add(1); 
list.add(2); 
list.add(3); 
list.add(4); 
list.add(5); 
list.add(6); 
list.add(7); 
//正常循環 
for (int i = 0; i < list.size(); i++) { 
 System.out.println("i的值:" + i + " 對應的數字:" + list.get(i)); 
} 
System.out.println("沒有remove前list的項:"+list.size()); 
//邊循環邊刪除 
for (int i = 0; i < list.size(); i++) { 
 System.out.println("i的值:" + i + " 對應的數字:" + list.get(i)); 
 if(list.get(i) == 3) list.remove(list.get(i));//刪除list的第四項 
} 
System.out.println("remove后list的項:"+list.size()); 
System.out.println("==========remove后的list=========="); 
for (int i = 0; i < list.size(); i++) { 
 System.out.println("i的值:" + i + " 對應的數字:" + list.get(i)); 
} 

執行代碼, 結果如下:

i的值:0 對應的數字:0 
i的值:1 對應的數字:1 
i的值:2 對應的數字:2 
i的值:3 對應的數字:3 
i的值:4 對應的數字:4 
i的值:5 對應的數字:5 
i的值:6 對應的數字:6 
i的值:7 對應的數字:7 
沒有remove前list的項:8 
i的值:0 對應的數字:0 
i的值:1 對應的數字:1 
i的值:2 對應的數字:2 
i的值:3 對應的數字:3 
i的值:4 對應的數字:5 
i的值:5 對應的數字:6 
i的值:6 對應的數字:7 
remove后list的項:7 
==========remove后的list========== 
i的值:0 對應的數字:0 
i的值:1 對應的數字:1 
i的值:2 對應的數字:2 
i的值:3 對應的數字:4 
i的值:4 對應的數字:5 
i的值:5 對應的數字:6 
i的值:6 對應的數字:7 

可以看到沒有刪除前, 我們的list的項和循環對應的數字都是正確的, 但是下面的循環在刪除第4個元素后,第4,5,6個項對應的數字本應該是4,5,6, 但是這里卻變成了5,6,7.

原因是,我們刪除第4項后,list的長度就變成7,而且,list會把第4項后面的值往前移一位, 也就是說,i=3時,list.get(i)=4,i=4時,list.get(i)=5,i=5時,list.get(i)=6,i=6時,list.get(i)=7..  我們再說的形象一點, 就是本來有8層糕點,依次是0-7,豎起來,大的在上,小的在下,我們從下往上數,數到第5個的時候,吃掉這一層糕點,這時,上面三層分別往下移了一層
所以, 值為4的項我們根本沒有循環到

那有什么方法可以實現remove呢, 有個笨方法,是新建一個tempList, 把要刪除的項全部add進去,最后用list.removeAll(tempList)實現 . 但是這里我們有更好的方法, 就是倒序刪除

還是上面的例子, 我們看代碼:

List<Integer> list = new ArrayList<Integer>(); 
list.add(0); 
list.add(1); 
list.add(2); 
list.add(3); 
list.add(4); 
list.add(5); 
list.add(6); 
list.add(7); 
//正常循環 
for (int i = 0; i < list.size(); i++) { 
 System.out.println("i的值:" + i + " 對應的數字:" + list.get(i)); 
} 
System.out.println("沒有remove前list的項:"+list.size()); 
 
//邊循環邊刪除 
for (int i = list.size() -1 ; i >= 0; i--) { 
 System.out.println("i的值 " + i + " 對應的數字 " + list.get(i)); 
 if(list.get(i) == 3) list.remove(list.get(i)); 
} 
System.out.println("remove后list的項:"+list.size()); 
 
System.out.println("==========remove后的list=========="); 
for (int i = 0; i < list.size(); i++) { 
 System.out.println("i的值 " + i + " 對應的數字 " + list.get(i)); 
} 

執行代碼,結果如下:

i的值:0 對應的數字:0 
i的值:1 對應的數字:1 
i的值:2 對應的數字:2 
i的值:3 對應的數字:3 
i的值:4 對應的數字:4 
i的值:5 對應的數字:5 
i的值:6 對應的數字:6 
i的值:7 對應的數字:7 
沒有remove前list的項:8 
i的值 7 對應的數字 7 
i的值 6 對應的數字 6 
i的值 5 對應的數字 5 
i的值 4 對應的數字 4 
i的值 3 對應的數字 3 
i的值 2 對應的數字 2 
i的值 1 對應的數字 1 
i的值 0 對應的數字 0 
remove后list的項:7 
==========remove后的list========== 
i的值 0 對應的數字 0 
i的值 1 對應的數字 1 
i的值 2 對應的數字 2 
i的值 3 對應的數字 4 
i的值 4 對應的數字 5 
i的值 5 對應的數字 6 
i的值 6 對應的數字 7 

我們可以看到變循環變刪除,并不影響后面的元素, remove后的list也和第一次的結果是一樣的 . 這是因為我們刪除list元素,list的長度是會變小, 但是變化的只是比當前被刪除元素的項大的項, 而我們這里使用倒序循環, 大的項, 我們已經執行過了, 所以不會影響.. 再用上面的比喻來說明,這次我們是從上往下數,數到第4個的時候,吃掉這一層糕點,這時,上面三層分別往下移了一層 , 但是這不影響我們之前數過的蛋糕, 而且對下面的蛋糕也不影響, 這就是原理

總結

以上就是本文關于ArrayList在for循環中使用remove方法移除元素方法介紹的全部內容,希望對大家有所幫助。感興趣的朋友可以參閱:Java實現跳躍表(skiplist)的簡單實例   Java多線程ForkJoinPool實例詳解  等。感謝朋友們對億速云網站的支持。有什么問題或者想要了解的可以隨時給我們留言,小編會及時回復大家的。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新余市| 上饶县| 卢龙县| 淳安县| 曲水县| 鸡泽县| 汉沽区| 杂多县| 德清县| 怀化市| 新田县| 叙永县| 赞皇县| 青浦区| 西宁市| 榕江县| 枞阳县| 高淳县| 布尔津县| 会宁县| 蒲城县| 高平市| 廉江市| 九龙坡区| 伊宁市| 宣威市| 达州市| 营山县| 灵璧县| 搜索| 来宾市| 元朗区| 靖安县| 崇文区| 友谊县| 甘泉县| 黄大仙区| 从江县| 奇台县| 拉孜县| 西吉县|