记录一下前一段时间写代码出现的一个问题。我循环一个jsonArray,为空的字段,删除掉,我一开始用的是for循环,发现删除有问题,就去百度了下,说是用迭代器(iterator),今天有空,就看了下,才发现二者的区别的。
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
for (int i = 0; i < l.size(); i++) {
String data = (String) l.get(i);
if (StringUtils.isEmpty(data)) {
//remove 文档中有这句
//Shifts any subsequent elements to the left
//将任何后续元素移动到左边
l.remove(i);
}
}
System.out.println(l.toString());
}
这样写循环的话,就有问题。因为第一个键值为空,所以删除下标为零的数据。然后整个list前移,数据大概就是这样: [“aa”,“bb”]。for循环处,下标增加1. i=1,然后就直接到bb了,aa就跳过去了。
正确的写法应该使用迭代器(iterator)
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
if(StringUtils.isEmpty(str)){
iter.remove();
}
}
System.out.println(l.toString());
这样就正常遍历了,为什么呢。因为在Iterator的remove方法中,自动把当前下标值cursor属性进行了-1,所以下次遍历,还是从为0的下标开始遍历的,所以就是正常遍历的了。而同样放在上面的例子中。我们显式对下标进行-1操作,其也是可以正常遍历的。
List l = new ArrayList();
l.add("");
l.add("aa");
l.add("bb");
for (int i = 0; i < l.size(); i++) {
String data = (String) l.get(i);
if (StringUtils.isEmpty(data)) {
//remove 文档中有这句
//Shifts any subsequent elements to the left
//将任何后续元素移动到左边
l.remove(i);
i--;
}
}
System.out.println(l.toString());
}
区别在于对于remove的处理操作是有些不同的。Iterator迭代器,是会对下标index进行-1操作,而我们直接for循环ArrayList进行处理,则需要在remove之后,下标index进行显式-1,才可以正常循环,不遗漏其中的某个元素。