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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

哥们今天删除元素的操作做出来一些毛病,实在不知道什么原因。请教大神,得出结论。希望大家能够总结经验,不要犯类似错误。
代码如下:
ArrayList<String> list = new ArrayList<>();
list.add("hello");
                list.add("world");
                list.add("java");
                list.add("java");
list.add("java");
for (int i = list.size()-1; i >= 0; i--) {
                        if("java".equals(list.get(i))){
                                list.remove(i);
                        }
        }
当时我是非常不解,为什么删不干净呢。后来明白ArrayList来删除一个元素,角标就会往前走1;到最后删除只能删除一半,解决办法是从后往前删。改进版本:
for (int i =0; i < list.size(); i++) {
                        if("java".equals(list.get(i))){
                                list.remove(i);
                        }
}


点评

你代码写反了。【改进版本】反而是删不干净的  发表于 2015-4-3 23:51

5 个回复

倒序浏览
好的,学习了
回复 使用道具 举报
这个应该是因为ArrayList是可变长度引起的,开始角标为 0 1 2 3,当你把1角标删了之后,那么原来的2-->1,3-->2,而你此时的角标 i 已经加1,那么,新出来的1会被跳过去,你正着也可以删,只是要把 i 的控制放到for里面,不要每次都加1,譬如:
for (int i =0; i < list.size(); ) {
                        if("java".equals(list.get(i))){
                                list.remove(i);
                                continue;
                        }
                        i++;
}
回复 使用道具 举报
哈哈。。。
回复 使用道具 举报
本帖最后由 JarryHorse 于 2015-4-4 17:58 编辑
z47057554 发表于 2015-4-4 15:19
这个应该是因为ArrayList是可变长度引起的,开始角标为 0 1 2 3,当你把1角标删了之后,那么原来的2-->1,3 ...

哥们儿好有杀气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马