黑马程序员技术交流社区

标题: 遍历集合 [打印本页]

作者: 崔陈喜    时间: 2012-5-13 13:21
标题: 遍历集合
        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--”啊?不明白,请帮忙解决一下
作者: hongbo    时间: 2012-5-13 13:25
判断过了,就移走{:soso_e100:}
作者: 倪杭乘    时间: 2012-5-13 13:36
判断为21岁的添加到 list2,从list1中删除
remove方法会使集合长度变化,原来指向的那个元素已经到了i--这个位置上,重新指向它
作者: 孙宇晨    时间: 2012-5-13 13:42
Person p = (Person) list1.get(i);
这行代码执行以后 指针移到下一位了.所以i--才是你要删除的元素
希望能帮到你

作者: 赵茹艳    时间: 2012-5-13 13:45
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--的目的是等于把指针归零,确保每一次判断的对象都是上一次判断的下一个,即使有删除也不会有遗漏。
作者: It's_Zero    时间: 2012-5-14 12:25
刚拿着你的代码做了一下输出测试
  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.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2