转贴的一个挺有意思的程序

先看一个例子 :
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 上的所有组件等 . 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值