java中的LIST在刪除時,一般會用list.remove(o);
但這樣往往會出現問題,先來看下面的這段代碼:
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
27
28
29
30
31
32
33
34
|
package com.demo; import java.util.ArrayList; import java.util.List; public class Test11 { public void delete(){ List<Integer> list = new ArrayList<Integer>(); list.add( 1 ); list.add( 2 ); list.add( 2 ); list.add( 3 ); for ( int i = 0 ; i < list.size(); i++) { if (list.get(i)== 2 ){ list.remove(i); } } this .outputList(list); } private void outputList(List<Integer> list){ for (Integer i : list) { System.out.println(i); } } public static void main(String[] args) { Test11 t = new Test11(); t.delete(); } } |
返回結果是:
1
2
3
4
5
|
1 2 3 |
這結果顯然不是我們的預期,我們是希望刪除List中所有為2的元素,但輸出結果中卻出現了2,這是因為在i等于1時,刪除了List中的index為1的元素2,這時候list為[1,2,3], 但接下來,i遞增后,等于2,在list.get(i)時,取出來的結果就成為了3了,也就是說隨著list元素的刪除,index是隨之變化的,這就是其中的陷阱,于是,我們得尋找一個在刪除時,索引不發生變化的迭代方式來刪除,而iterator是被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,也就是用cursor來維護這個索引表,于是,可以這樣來刪除:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
package com.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test11 { public void delete(){ List<Integer> list = new ArrayList<Integer>(); list.add( 1 ); list.add( 2 ); list.add( 2 ); list.add( 3 ); this .iteratorDelete(list.iterator(), 2 ); this .outputList(list); } private void iteratorDelete(Iterator<Integer> it, int deleteObject){ while (it.hasNext()){ int i = it.next(); if (i==deleteObject){ it.remove(); } } } private void outputList(List<Integer> list){ for (Integer i : list) { System.out.println(i); } } public static void main(String[] args) { Test11 t = new Test11(); t.delete(); } } |
這個代碼結果就是正確的了!
可能有人會說,我是在iterator中刪除的,為什么list的值會發生改變?這個問題,自已思考去吧!思考不出來,可以轉行了!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.cnblogs.com/zhangfei/p/4510584.html