先看一个例子 :
import java.util.*;
import java.io.*;
public
class TestClass {
public
static
void main(String[] args) {
Vector vItems =
new Vector();
vItems.add( aa1 );
vItems.add( aa2 );
vItems.add( bb3 );
vItems.add( bb4 );
// 现在想删除掉所有含有 bb 字符的元素
for (
int i=0;i<vItems.size();i++){
if (vItems.elementAt(i).toString().indexOf( bb )!=-1){
vItems.remove(i);
}
}
for (
int i= 0;i<vItems.size();i++){
System.out.println(vItems.elementAt(i).toString());
}
}
}
看看结果中居然还有 bb4 , 仔细分析一下 , 当删除 bb3 的时候 ,I=2, 然后 vItems.remove( 2 ); 再进行下一次循环 ,I=I+1=3, 注意此时的 vItems.size()=3 ( 由于删除了一个元素 , 所以 size 变小了 ) , 所以循环终止 , 导致 bb4 没有被删除 .
那如何才可以彻底删除呢 ?
我们把删除的循环改一下 :
for (
int i=vItems.size()-1;i> = 0;i--){
if (vItems.elementAt(i).toString().indexOf( bb )!=-1){
vItems.remove(i);
}
}
再执行一下 , 发现这次结果正确 . 原因就是当删除后面的元素时 , 前面的顺序并没有改变 , 循环遍历了所有元素 . 而第一个例子中 , 删除前面的元素 , 后面的元素的位置都发生了改变 , 所以有遗漏 .
稍微总结一下 :
在循环
for (
int i=0;i< x ;i++) 中 , 尽量保持 x 的值不变 , 否则容易产生遗漏 , 或者出现死循环 .
如果 x 在循环体中发生改变则可以尝试
for (
int i= x ;i>=0;i--) .
这个问题在 Java 中还是比较出现还是比较常见的 : 比如循环删除一个 Panel 上的所有组件等 .