1. 程式人生 > >for迴圈中刪除,資料不正確

for迴圈中刪除,資料不正確

背景:在寫業務程式碼的時候,需要篩選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}]

在實際業務程式碼中,用迭代器迴圈刪除的方法得到了理想的方法。