前几天工作中遇到了,需要一边在循环List的时候,一边根据List中bean的字段值删除某些bean,重而减小循环次数。现在将问题简化,如何在遍历List的时候,同时删除其中的元素。
传统方式:
public void testRemoveList(){
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
list.add("9");
list.add("10");
list.add("11");
list.add("12");
list.add("13");
list.add("14");
list.add("15");
int size = list.size();
for(int i = 0;i<size;i++){
String num = list.get(i);
if(Integer.valueOf(num)%4==0){
list.remove(i);
}
System.out.println(num);
}
}
运行结果,肯定出现数组越界异常。
java.lang.IndexOutOfBoundsException: Index: 12, Size: 12
原因就是在根据条件删除的时候,list的大小在变化,从而出现数据越界。
有没有办法实现呢?经过自己的查找,发现通过list的iterator去删除就行了
改成下面的方法:
public void testRemoveList(){
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
list.add("9");
list.add("10");
list.add("11");
list.add("12");
list.add("13");
list.add("14");
list.add("15");
Iterator it = list.iterator();
while(it.hasNext()){
String num = (String)it.next();
if(Integer.valueOf(num)%4==0){
it.remove();
System.out.println("delete num is " + num);
}else{
System.out.println("rest num is " + num);
}
}
}
使用了迭代器就能够实现。