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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java陈辉 中级黑马   /  2013-12-12 21:55  /  1645 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 java陈辉 于 2013-12-14 18:10 编辑

下面这段代为什么在for循环里面加上一个i--之后,就能完全删除掉abc?不加i--,就删除不掉?求解释。
public class Test {

                 public static void main(String[] args) {
                ArrayList<String> al = new ArrayList<String>();
                al.add("abc1");
                al.add("abc");
                al.add("abc");
                al.add("abc");
               

              for(int i=0; i<al.size(); i++){
                        if("abc".equals(al.get(i))){
                                al.remove(i);
                                i--;         //这里为什么要加一个i--之后,能把abc完全删除掉
                        }
                }
                        
                System.out.println(al);

        }

}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

8 个回复

倒序浏览
因为在遍历的过程中:
1、 i=2时,发现有重复的元素,然后删除。
2、如果没有i--这一步,那么下一次循环就是i=3,但是索引3位置的abc就自动移到索引2的位置
3、那么就遍历不到新的索引2位置的abc,所以会多出来一个abc
回复 使用道具 举报
本帖最后由 風諾 于 2013-12-12 22:15 编辑

集合,和数组不一样,集合长度可变,数组固定
对于ArrayList集合,你可以删除一个元素以后:
1、打印集合长度看看集合长度是否有变化
2、删除0脚标元素后,立刻打印0脚标元素,看看是什么值
回复 使用道具 举报
List跟数组的区别是其长度(size)是可变的,当删除掉List中的一个元素时,其长度会减一。如果没有i--,那么循环执行第二遍时长度变成3,i变成1,到第三遍判断条件时长度已经减为2,而i也增为2,条件不成立,循环结束。总共删掉了两个“abc”,还剩一个。i--的情况自己推理一下吧。不明白的时候用debug watch变量的变化会有帮助。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 小斥候 于 2013-12-12 22:43 编辑

al.size()是动态变化的,第一个元素被remove后size就减了1了,就是说,原来的第二个元素放到了第一个位置上。(形象一点就是:宝石消除游戏,下面的宝石被消除后,上面的就自动落下来了)
最好是从后往前remove-------for(int i=al.size();i>=0;i--)

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
这里涉及到ArrayList集合中remove方法的知识点。
简单说就是:
当调用remove方法删除集合内的元素的时候,
是把这个元素从整个列表中删除,然后这个元素之后的所有元素往前移一位,即删除的元素之后所有的元素角标都-1.
那么如果循环当中计数器i不-1的话就相当于是跳过了一个元素,跳过的元素的角标就是原先删除元素的角标。
这么说能理解吗?

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
icyyaww 中级黑马 2013-12-12 23:20:38
7#
假设你有四个兜,每个兜里面有一个鸡蛋。你把第二个鸡蛋拿出来煮熟然后吃掉。后面的鸡蛋会依次往前面的兜里跳。也就是第三个鸡蛋进入第二个兜。第四个鸡蛋会进入第三个兜里。
这个时候第二个兜里还是有鸡蛋所以得从新检查。所以你得回头(i--)从新检查第二个兜。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
其实楼主可能就是没有考虑到list集合会随着remove的删除,size减少,所有元素脚标-1,这样你再考虑为什么!我想应该会明白点吧!

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
ISAI 中级黑马 2013-12-14 13:17:08
9#
首先你要知道list和数组的区别。数组里面的元素减少不会造成数组长度的减少。而集合就会。知道这个后,就很容易知道为什么要i--了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马