JAVA的LIST在刪除時,一般會用list.remove(o); 但這樣往往會出現問題,先來看下面的這段代碼:
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
這結果顯然不是我們的預期,我們是希望刪除List中所有為2的元素,但輸出結果中卻出現了2,這是因為在i等於1時,刪除了List中的index為1的元素2,這時候list為[1,2,3], 但接下來,i遞增后,等於2,在list.get(i)時,取出來的結果就成為了3了,也就是說隨着list元素的刪除,index是隨之變化的,這就是其中的陷阱,於是,我們得尋找一個在刪除時,索引不發生變化的迭代方式來刪除,而iterator是被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,也就是用cursor來維護這個索引表,於是,可以這樣來刪除:
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的值會發生改變?這個問題,自已思考去吧!思考不出來,可以轉行了!
