A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hurryup 高级黑马   /  2013-12-1 20:57  /  916 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hurryup 于 2013-12-2 16:48 编辑

为何for(int i=0;i<list.size();i++){if(list.get(i)<60) list.remove(i);}会有什么问题
而改成for(int i=list.size()-1;i>=0;i--){if(list.get(i)<60) list.remove(i);}就没问题了呢?

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
你问的是什么,没太明白。
我感觉,你在问这两句的区别。
第一个for的中间判断语句是比较小于list的大小,回回都得获取大小,费时费力。
第二个for是反向遍历,只是for的第一个参数里获取一次list的大小,中间判断的只是一个0,不用获取list的大小了。
这样会使程序运算速度更快。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 依然 于 2013-12-2 00:59 编辑

大概知道你的问题了,当你从0->length()的顺序时,你每次的remove()操作都会改变数组的顺序和内容。
比如数组的内容是     list = {11,22,33,44,55,66};
    for(int i=0;i<list.size();i++)
    {
        if(list.get(i)<60)  
            list.remove(i);
     }
     当你执行第一次循环内容时候,list[0]=11 < 60;
     所以执行 list.remove(),结果为 list={22,33,44,55,66}
     第二次循环:
          list[1]=33  < 60,满足if条件,执行list.remove()
         结果为list={22,44,55,66}
    第三次循环:
         list[2]=55  < 60 ,满足条件,执行list.remove()
          结果为list={22,44,66}
  
   而你使用另一个方法:
        for(int i=list.size()-1;i>=0;i--)
        {
                if(list.get(i)<60)
                list.remove(i);
        }
    这个方法是从后面开始减少,不影响前面内容的角标顺序,所以每个元素都可以遍历的到;

    对于集合的遍历与修改可以用实现ListIterator来完成(list.listIterator())。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
依然 发表于 2013-12-2 00:50
大概知道你的问题了,当你从0->length()的顺序时,你每次的remove()操作都会改变数组的顺序和内容。
比如数 ...

你这个解释的比较靠谱些,谢谢你的解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马