循環判斷移除list的元素時遇到的問題-移除時,list的大小會改變

項目背景:

當向數據庫中插入企業信息時,如果企業庫中有該信息,則不進行插入;如果企業表中沒有該企業信息,則進行插入操作;

做法:

需要將企業庫中已有的企業id查詢出來,與要插入的一批企業信息做一下過濾操作;

坑:

list<CompanyInfo> list; //這是要插入的所有的企業信息

List<String> companyCodes; //這是企業表中有的企業編碼

//我們要根據companyCodes對list做一下過濾操作

//錯誤做法,隨着list的變小,for循環的次數也會變小;
for(CompanyInfo com : list){
    if(companyCodes.contains(com.getCompanyCode)){
        list.remove(com);
    }
}
//錯誤做法2  這是一旦發生移除元素的操作,就是越界報錯
int size = list.size();
for(int i=0;i<size;i++){
       if(companyCodes.contains(list.get(i).getCompanyCode){
               list.remove(list.get(i)); 
        }
}
//錯誤做法3,也會報錯,這是因爲list=list2,都是指向的一個引用對象,一個減小,另外一個也減小
List<CompanyInfo> list2 = list;
for(CompanyInfo com : list){
    if(companyCodes.contains(com.getCompanyCode)){
        list2.remove(com);
    }
}
//正確做法:
list<CompanyInfo> res = new ArrayList<>();
for(CompanyInfo com : list){
    res.add(com);
}
//此時再進行移除過濾操作即可。
for(CompanyInfo com : list){
    if(companyCodes.contains(com.getCompanyCode)){
        res.remove(com);
    }
}

這是因爲隨着list的remove操作,它的大小會改變的,for循環的次數會動態改變的;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章