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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔陈喜 中级黑马   /  2012-5-13 13:21  /  2287 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        public static void main(String[] args) {
                List list1 = new ArrayList();
                list1.add(new Person("刘育郡", 21));
                list1.add(new Person("孙雪娇", 18));
                list1.add(new Person("杨丛玮", 21));
                list1.add(new Person("唐中玉", 21));
                list1.add(new Person("崔瑞龙", 20));

                List list2 = new ArrayList();

                for (int i = 0; i < list1.size(); i++) {
                        Person p = (Person) list1.get(i);
                        if (p.getAge() == 21) {
                                list2.add(p);
                                list1.remove(i--);
                        }
                }
为什么最后list.remove(i--)中要:“i--”啊?不明白,请帮忙解决一下

5 个回复

正序浏览
刚拿着你的代码做了一下输出测试
  1. public static void main(String[] args) {
  2.         List list1 = new ArrayList();
  3.         list1.add(new Person("刘育郡", 21));
  4.         list1.add(new Person("孙雪娇", 18));
  5.         list1.add(new Person("杨丛玮", 21));
  6.         list1.add(new Person("唐中玉", 21));
  7.         list1.add(new Person("崔瑞龙", 20));

  8.         List list2 = new ArrayList();

  9.         for (int i = 0; i < list1.size(); i++) {
  10.                 Person p = (Person) list1.get(i);
  11.                 if (p.getAge() == 21) {
  12.                         list2.add(p);
  13.                         System.out.println(i);
  14.                         list1.remove(i--);
  15.                         System.out.println(i);
  16.                 }
  17.         }
  18.         }
复制代码
结果是:
0
-1
1
0
1
0


解释:当 p.getAge() == 21 符合条件  也就是这个Person("刘育郡", 21)符合条件   list2就把这个对象添加进去,在list1中删除这个对象,删除了这个对象。
而Person("刘育郡", 21)这个对象的标号是 0 的,当list1删除了 Person("刘育郡", 21) 后 Person("孙雪娇", 18)的下标就变成0了 而此时如没有那个i--,
i  通过for里面的i++变成了1 , 从而 Person("刘育郡", 21) 这个对象就被漏掉了
数组中的一个元素被删了,后面的元素向前移动了一个位置,此时下标不再需要+1了  理解了没?
  1.         public static void main(String[] args) {
  2.         List list1 = new ArrayList();
  3.         list1.add(new Person("刘育郡", 21));
  4.         list1.add(new Person("孙雪娇", 18));
  5.         list1.add(new Person("杨丛玮", 21));
  6.         list1.add(new Person("唐中玉", 21));
  7.         list1.add(new Person("崔瑞龙", 20));

  8.         List list2 = new ArrayList();

  9.         for (int i = 0; i < list1.size(); i++) {
  10.                 Person p = (Person) list1.get(i);
  11.                 if (p.getAge() == 21) {
  12.                         list2.add(p);
  13.                         System.out.println(i);
  14.                         list1.remove(i--);
  15.                         System.out.println(i);//测试 i  的输出
  16.                 }
  17.         }
  18.         }
复制代码
其实这里的list1.remove方法在这个程序中并没什么实际大的作用
完全可以直接遍历
  1.         public static void main(String[] args) {
  2.         List list1 = new ArrayList();
  3.         list1.add(new Person("刘育郡", 21));
  4.         list1.add(new Person("孙雪娇", 18));
  5.         list1.add(new Person("杨丛玮", 21));
  6.         list1.add(new Person("唐中玉", 21));
  7.         list1.add(new Person("崔瑞龙", 20));

  8.         List list2 = new ArrayList();

  9.         for (int i = 0; i < list1.size(); i++) {
  10.                 Person p = (Person) list1.get(i);
  11.                 if (p.getAge() == 21) {
  12.                         list2.add(p);
  13.                 }
  14.         }
  15.         for (int i = 0; i < list2.size(); i++) {
  16.             System.out.println(((Person) list2.get(i)).getName());
  17.         }
  18.         }
复制代码

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
list1.add(new Person("刘育郡", 21));
                list1.add(new Person("孙雪娇", 18));
                list1.add(new Person("杨丛玮", 21));
                list1.add(new Person("唐中玉", 21));
                list1.add(new Person("崔瑞龙", 20));

这个是由List内部访问机制决定的,这个题目是要判断年龄为21岁的人,判断0号位置对象是符合条件的,会把0号位对象放入list2中,然后将0号位对象从list1中删除,如果不i--的话,下一次判断的时候就会从1号位置判断,而由于list长度可变,当0号位置被删除之后会由后面的对象依次补上,也就是说第二次进循环的时候,原先1号位置上的对象已经变为了0号位置,由于不把i--,会直接从1号位置判断,这样就会漏掉一个本来是1号位置,现在变为0号位置的对象,所以会出错。而i--的目的是等于把指针归零,确保每一次判断的对象都是上一次判断的下一个,即使有删除也不会有遗漏。
回复 使用道具 举报
Person p = (Person) list1.get(i);
这行代码执行以后 指针移到下一位了.所以i--才是你要删除的元素
希望能帮到你
回复 使用道具 举报
判断为21岁的添加到 list2,从list1中删除
remove方法会使集合长度变化,原来指向的那个元素已经到了i--这个位置上,重新指向它
回复 使用道具 举报
判断过了,就移走{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马