for迴圈中刪除,資料不正確
阿新 • • 發佈:2018-12-05
背景:在寫業務程式碼的時候,需要篩選list中符合條件的物件 ,for迴圈不能奏效,當時的處理方法是,將刪除的index存放在陣列中,然後再倒序刪除原list中的資料。現在來試一下各種方法迴圈刪除的功能。
List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>(); for(int i=0;i<=6;i++){ Map<String,Object> tempMap = new HashMap<String,Object>(); tempMap.put("key", i); tempMap.put("value", i+"i"); tempList.add(tempMap); } for(int i=0;i<tempList.size();i++){ Map<String,Object> tempMap = tempList.get(i); System.out.println("當前list大小:"+tempList.size()); System.out.println("modiedMap"+tempList); System.out.println("當前的key===="+tempMap.get("key")); if((Integer)tempMap.get("key")==2){ tempList.remove(i); } }
執行結果發現:刪掉了key=2的map,但是同時也略過了key=3的map。
//換成foreach迴圈 for(Map<String,Object> temMap : tempList){ System.out.println("當前list大小:"+tempList.size()); System.out.println("modiedMap"+tempList); System.out.println("當前的key===="+temMap.get("key")); if((Integer)temMap.get("key")==2){ tempList.remove(temMap); } }
報錯:Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.csii.bmp.baseinfo.action.Test.main(Test.java:35)
原因:程式碼中修改了list,導致list的size前後不一致,arraylist判斷報錯。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// System.out.println("a");
List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>();
for(int i=0;i<=6;i++){
Map<String,Object> tempMap = new HashMap<String,Object>();
tempMap.put("key", i);
tempMap.put("value", i+"i");
tempList.add(tempMap);
}
System.out.println("原始的tempList==="+tempList);
Iterator<Map<String,Object>> it = tempList.iterator();
while(it.hasNext()){
Map<String,Object> tempMap = it.next();
System.out.println("當前處理的tempMap:==="+tempMap);
if((Integer)tempMap.get("key")==2){
it.remove();
}
System.out.println("處理後的tempList==="+tempList);
//驗證是否會跳過下一個,結果發現不會
if((Integer)tempMap.get("key")==3){
System.out.println("驗證3啦!!");
}
}
}
}
執行結果:刪掉了想要刪掉的資料,並且沒有跳到下一個
原始的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=0i, key=0}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=1i, key=1}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=2i, key=2}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=3i, key=3}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
驗證3啦!!
當前處理的tempMap:==={value=4i, key=4}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=5i, key=5}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
當前處理的tempMap:==={value=6i, key=6}
處理後的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
在實際業務程式碼中,用迭代器迴圈刪除的方法得到了理想的方法。