有時候我們需要在一個ArrayList的for循環中動態刪除元素的需求, 廢話不多說看代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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)); } //邊循環邊刪除 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)); } |
執行代碼, 結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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)實現 . 但是這里我們有更好的方法, 就是倒序刪除
還是上面的例子, 我們看代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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)); } |
執行代碼,結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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方法移除元素方法介紹的全部內容,希望對大家有所幫助。感謝朋友們對服務器之家網站的支持。有什么問題或者想要了解的可以隨時給我們留言,小編會及時回復大家的。
原文鏈接:http://blog.csdn.net/u012316120/article/details/51509066