首先上一段代码:
needDelete()方法:决定是否要删除
public static boolean needDelete(Object obj) {
if (obj.equals("1"))
return true;
else
return false;
}
方案一运行:
public static void main(String[] args) {`
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("1");
list.add("1");
list.add("2");
list.add("1");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (needDelete(obj)) //needDelete返回boolean,决定是否要删除
{
it.remove();
}
}
System.out.println(list.toString());
}
此处的输出结果为:[2, 2, 2]
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("2");
list.add("1");
list.add("1");
list.add("2");
list.add("1");
for (int i=0;i<list.size();i++) {
if(needDelete(list.get(i))){
list.remove(i);
}
}
System.out.println(list.toString());
输出结果为:[2, 2, 1, 2]
由此可见:Iterator迭代器( it.remove())能够将集合中全部不想要的数据删除,即数据安全,而简单的用for循环+list.remove(i)却删漏了(即数据不安全)
那么如果我们实在想用for循环又该怎么办呢?
解决方案如下:
for (int i=0;i<list.size();i++) {
if(needDelete(list.get(i))){
list.remove(i);
i--;//加上这一句,就能实现不删漏啦~
}
}
System.out.println(list.toString());[2, 2, 2]
解释:为什么写一个 i-- 就能解决问题呢?这是因为list集合中的ArrayList是一个有序的集合,当我们删除某个元素之后,这个元素后面的元素的下标将会向前推进一个,我们只要能拿到删除后的集合元素的下标也可以实现不漏删。
进一步说明:
现在有这样一个集合: [1,2,3,4,5,6,7]
然后我们删除下标为4的元素得到: [1,2,3,4,6,7]
此时6,7这两个元素的下标发生了变化,下标减小了1
由此我们能够得到:只需要每次移除一个元素后把指定的下标退一(即i--)即可!