如何一次性删除List里的所有元素?

一次性删除List里的所有元素?不仅听起来简单(只是有个在删除元素时元素下标动态变化的问题在里面,有点苦恼),而且做起来其实也简单(大话了,只是到了后面解决了后才觉得简单的),得益于一同行问的“js中删除元素时下标从1变为0”的问题。

    出现问题的代码是这样的(他的是javascript代码,我用java的List模拟):

 
 
  1.     List list = new ArrayList();  
  2.     list.add("1");  
  3.     list.add("2");  
  4.     list.add("3");  
  5.     list.add("4");  
  6.     list.add("5");  
  7.     list.add("6");  
  8.     for (int i = 0; i < list.size(); i++) {  
  9.         System.out.print(list.get(i)+" ");  
  10.     }  
  11.     System.out.println("");  //多的输出语句只是为了方便看运行结果。
  12.     System.out.println("------------------");  
  13.     for (int i = 0; i < list.size(); i++) {  
  14.         list.remove(i);  
  15.     }  
  16.     for (int i = 0; i < list.size(); i++) {  
  17.         System.out.print(list.get(i)+" ");  
  18.     } 

    他原本想把所有的元素都给删除的,结果最后打印出来的结果是这样的,有些没有被删除掉:

     

 
 
  1. 123456  
  2. --------  
  3. 246 

    看看,这结果很明显出问题了,对吧?本来想把所有的元素都给删除,结果竟然行事不果断,“斩草没有除掉根”,悲剧了,还剩下3个( 我竟然会想到斩草除根这个词,暗暗佩服自己。)。他一开始就思考到了问题的最根本原因,就是第二次删除的时候,原本下标为1的元素的下标就由1变为0了,原本下标为2的元素下标由2变为了1,由此而做了替死鬼,真是冤枉啊,真是的。所以,2未被删除,3就被删除了(更何况本身List的长度也在变化,长度影响遍历删除的次数,这里不赘述)。一直到for循环最后也依然阻止不了这场悲剧的发生( 该是幸运吧,总算有元素活下来了,但对于我们编代码的就要受罪了),以此类推。

    我的解决方法是这样的:

    考虑到元素下标每次都要减1变为0(其实,我错了,是元素下标隔1降1),何不如用两个变量来控制循环?我就给了两个变量i和j。i来控制循环次数,j来去除下标动态变化的条件,len解决list长度变化的问题。

代码如下:

 
 
  1. for (int i = 0,j = 0,len = list.size(); i < len; i++) {       
  2.  list.remove(j);             
  3. }       
  4. 还有另一个“狗血”版本:  
  5. for (int i = 0,j = 0; i < list.size(); ) {        
  6. list.remove(j);             
  7. }  

代码运行的结果是:

     

 
 
  1. 123456  
  2. -------- 

    结果倒是正常输出了,可两个结果,怎么看怎么不好。

    但最终他自己想到了最优化的代码。他优化后的代码如下:

 
 
  1. for (int i = 0; i < list.size(); i++) {  
  2.      list.remove(i--);  

    从这件小事可以看出,分享起作用了,他把这个问题分享给了我,我把我的想法分享给了他,而我们由共同由此解决了问题,找到了可行的答案。所以说,分享是一种好习惯。而且,我始终坚信,会分享、会帮助别人的人他注定会海纳百川,也会有更多的人会体会到分享的快乐。

转自:http://51wifygoo1go.blog.51cto.com/6455479/1123025

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值