黑马程序员技术交流社区
标题:
遍历集合
[打印本页]
作者:
崔陈喜
时间:
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
刚拿着你的代码做了一下输出测试
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);
System.out.println(i);
list1.remove(i--);
System.out.println(i);
}
}
}
复制代码
结果是:
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了 理解了没?
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);
System.out.println(i);
list1.remove(i--);
System.out.println(i);//测试 i 的输出
}
}
}
复制代码
其实这里的list1.remove方法在这个程序中并没什么实际大的作用
完全可以直接遍历
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);
}
}
for (int i = 0; i < list2.size(); i++) {
System.out.println(((Person) list2.get(i)).getName());
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2