日期:2014-05-19  浏览次数:20601 次

List删除符合条件项
今天写一段代码时遇到了点小问题,遍历某个List,当符合条件时删除该项。第一种写法报错,第二种写法只删了一半,第三种写法正确。我记得以前看过,说是第一种写法是指针性质的,不能这样删除。希望有人详细说一下。第二种方法我的理解是:当删除了当前项后,下一项会向前移,下标变为当前项,所以下一项不会做判断。
求人指点或探讨。谢谢!
1.
Java code

List<Detail> mqList=bean.getMqList();
for(Detail d:mqList){
  if(符合某条件){
    mqList.remove(d);
}
}


2.
Java code

List<Detail> mqList=bean.getMqList();
for(int i=0;i<mqList.size();i++){
  if(符合某条件){
    mqList.remove(i);
}
}


3.
Java code

List<Detail> mqList=bean.getMqList();
Iterator i=mqList.iterator();
while(i.hasNext()){
  if(符合某条件){
    i.remove();
}
}




------解决方案--------------------
第一种写法,实际上走的是迭代器,而List的remove不会更新迭代器状态,具体参见这里:
http://www.blogjava.net/fingki/archive/2010/03/02/314268.html


第二种写法的问题很简单,就是移除后元素减少了,但是计数器(i)没有响应减少,所以位置就错了;


第三种写法是第一种的改进,正确的使用了Iterator的remove,而不是List自己的remove,所以正确。


还有可以这么写:
while(!mqList.isEmpty()) {
Detail d = mqList.remove(0);
}