先看一个例子 :
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 上的所有组件等 .
本文通过实例演示了在Java中循环删除Vector集合中特定元素时可能遇到的问题,并提供了解决方案。介绍了正向循环可能导致元素删除不完全的原因,推荐使用逆向循环确保所有目标元素被正确移除。
2304

被折叠的 条评论
为什么被折叠?



