背景
印象中List删除某个元素可以使用迭代器(Iterator)操作,但是在使用过程中犯了个小错误,在此记录。
错误写法
List<Object[]> gpObjs = (List<Object[]>) dataMap[0];
Iterator<Object[]> iterator = gpObjs.iterator();
while(iterator.hasNext()){
Object[] gpNext = iterator.next();
Long listId = (Long) gpNext[0];
String taskRunTime = (String) gpNext[1];
for (RecModuleListingDto recModuleListingDto : recModuleListingDtos) {
String taskRunTime1 = recModuleListingDto.getTaskRunTime();
Long listingId = recModuleListingDto.getListingId();
if(listingId.equals(listId) && StringUtils.equals(taskRunTime1,taskRunTime)){
gpObjs.remove(gpNext);//重点在这里,这个是错误写法
break;
}
}
}
if(gpObjs.isEmpty()){
return;
}
如果直接对当前list进行remove(object)最终会报
正确用法
要想在集合遍历的过程中删除指定元素,就务必使用迭代器自身的remove方法;
List<Object[]> gpObjs = (List<Object[]>) dataMap[0];
Iterator<Object[]> iterator = gpObjs.iterator();
while(iterator.hasNext()){
Object[] gpNext = iterator.next();
Long listId = (Long) gpNext[0];
String taskRunTime = (String) gpNext[1];
for (RecModuleListingDto recModuleListingDto : recModuleListingDtos) {
String taskRunTime1 = recModuleListingDto.getTaskRunTime();
Long listingId = recModuleListingDto.getListingId();
if(listingId.equals(listId) && StringUtils.equals(taskRunTime1,taskRunTime)){
iterator.remove();//使用迭代器的删除方法删除
break;
}
}
}
if(gpObjs.isEmpty()){
return;
}
最后查看 List<Object[]> gpObjs 数据已经别删除
总结
list使用迭代器删除元素一定要使用迭代器自己的remove方法而不是list自己的remove(obj)方法