题目:定义方法, 接收一个已装入Person对象的List, 删除List中age为20的Person
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Exercise2 {
public static void main(String[] args) {
List list = new ArrayList();
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(p);
i--;
}
System.out.println(list);
}
/*
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(i--);
}
System.out.println(list);
}
*/
}
class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
问题:红色部分是正确代码,蓝色部分是错误代码.为什么删除P对象 remove(p),i--;不可以呢,而是需要remove(i--);?最好详细回答 蓝色的代码貌似会出现死循环作者: 孔肖 时间: 2012-6-26 01:27
其实你就是少了括号
蓝色代码:
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20){
list.remove(p);
i--;//i--应该在移除后减一吧 不加{}就是循环一次减一
}
}作者: 李伟 时间: 2012-6-26 01:55
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(i--);//因为list.remove(i--)和list.remove(p)是不同的,
//remove(int index) 是移除此列表中指定位置上的元素,
//而remove(Object o) 是移除此列表中首次出现的指定元素(如果存在),也就是说如果需要删除的元素有多个,这个方法只能删一个。
//所以应该用list.remove(i--)
}
System.out.println(list);
} 作者: 周兴中 时间: 2012-6-26 02:14
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(p);
i--; //i--应该放在if语句内,否则无论是否查找到年龄为20的学生,都将会一直在list.get(0),死循环;
} 作者: Forever。 时间: 2012-6-26 09:17 本帖最后由 Forever。 于 2012-6-26 09:23 编辑
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(p);
i--;
}
你的死循环确实是因为这里的i--;
但是我理解你的思路是正确的只不过你忽略了一个极为细小的问题——————大括号;
试一下下面的代码相信你会明白粗心这个东西有多么的可怕:
public static void main(String[] args) {
List list = new ArrayList();
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Exercise2 {
public static void main(String[] args) {
List list = new ArrayList();
for(int i = 0; i < list.size(); i++){//你这里进入死循环的原因是你没有把i--放入if分支中。你现在看下运行过程,首先每做一次for循环都要将i+1
Person p = (Person)list.get(i);
if(p.getAge()==20)
list.remove(p);//如果if满足的话他会执行这条语句,
i--;// 这个i--由于没有放入if分支中所以不管if条件成立与否都会执行,那么这样一来for语句中i+1,到了这边又i-1你想想i的值是不是一直停在了原点啊,所以造成了死循环,
}
改正后:
for(int i = 0; i < list.size(); i++){
Person p = (Person)list.get(i);
if(p.getAge()==20){
list.remove(p);
i--;//只需要把i--放入if中来就可以了这样的话当if满足的时候他才会执行,不满足的话就不执行,这样就不会进入死循环了
}
}
我这里把API中List和ArrayList中的所以关于remove的方法摘要给你贴了上来
list中的