1. 程式人生 > >刪除List集合數據問題

刪除List集合數據問題

arr 第一次 二次 iterator print color 代碼 lin bsp

一、問題描述

String str1 = new String("1");  
String str2 = new String("2");  
String str3 = new String("3");  
String str4 = new String("4");  
String str5 = new String("5");  
List list = new ArrayList();  
list.add(str1);  
list.add(str2);  
list.add(str3);  
list.add(str4);  
list.add(str5);  
System.out.println("list.size()=" + list.size());         
  
for (int i = 0; i < list.size(); i++) { list.remove(i); // i--; //System.out.println(i+" "+list.get(i)+" "); } System.out.println("after remove:list.size()=" + list.size());

本來預期結果應該是:

list.size()=5  
after remove:list.size()=0

但實際上結果卻是:

list.size()=5  
after remove:list.size()=2

原因如下: List每remove掉一個元素以後,後面的元素都會向前移動 ,此時如果執行i++,則剛剛移過來的元素沒有被讀取。

分析:

  • List中有5條數據,需要循環5次,
  • 第一次數據為:1 2 3 4 5
  • 執行完remove(0) 後,數據為 2 3 4 5  , i=1
  • 第二次數據為:2 3 4 5
  • 執行完remove(1) 後,數據為 2 4 5  , i=2
  • 第三次數據為:2 4 5
  • 執行完remove(2) 後,數據為 2 4  , i=3
  • 此時如果加上上面註釋的代碼 System.out.println(i+" "+list.get(i)+" "); 循環第4、5次時就會出現異常

二、解決方法

解決方法1:每移過一次後,再把 i 移回來

for (int i = 0; i < list.size(); i++) {                
    list.remove(i);           
    i--;              
}

解決方法2:先刪除後面的元素

for (int i = list.size()-1; i >= 0; i--) { list.remove(i); }

解決方法3:使用iterator刪除

for(Iterator it = list.iterator();it.hasNext();){             
    it.remove();  
}

刪除List集合數據問題