public class Person extends Object{
String name;
 int age;
    public Person(String name,int age){
           this.name=name;
           this.age=age;
  } public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}        public boolean equals(Object o){
           if(o instanceof Person){
          Person p3=(Person)o;
         return this.age==p3.age&&this.name.equals(p3);  
         
        }
         else{
         return false;             
}
}
      
public String toString(){
return "Name: " + name + "\tAge: " + age;
}
}
import java.util.*;
public class TestPersonArrayList{public static void main(String args[]){
Person p1=new Person("li",31);
Person p2=new Person("lia",32);
Person p3=new Person("lib",34);
Person p4=new Person("lic",35);
ArrayList<Person>  persons=new ArrayList<Person>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
for(Person p:persons){
System.out.println(p.getName());
}
persons.add(0,p4);
for(Person p:persons){
System.out.println(p.getName());
}persons.remove(p2);for(Person p:persons){
System.out.println(p.getName());
}
}
}remove怎么不好用呢

解决方案 »

  1.   

    remove的参数是序数,
    把remove(p2);改成remove(2);
      

  2.   

    public boolean equals(Object o) {
    if (o instanceof Person) {
    Person p3 = (Person) o;
    return this.age == p3.age && this.name.equals(p3); } else {
    return false;
    }
    }这里 
    return this.age == p3.age && this.name.equals(p3);你用name 和整个person对象比较 会让equals返回false
    所以你remove的时候 此方法就会认为list内部的person与p2 不同就不去删除
      

  3.   

    LS的说对了,equals方法有问题
    return this.age==p3.age&&this.name.equals(p3.getName());  
      

  4.   

    ArrayList的remove方法有一个重载方法remove(int index)和remove(Object o),楼主的代码persons.remove(p2); 是没问题的。问题出在person这个类中,楼主重写的equals这个方法。remove方法中,是通过equals来判断要删除的对象是否包含在链表中的,楼主重写了equals方法,导致无法正确在链表中查找锁包含的对象。我测试了楼主的代码,remove是没问题的,可以从链表中正确删除p2。只要注释掉Person中的equals方法就可以了。
      

  5.   

    的确是equals的问题,remove没有问题
      

  6.   

    4楼正解,不过怎样重写equals正在考虑中
      

  7.   

    把   return this.age==p3.age&&this.name.equals(p3); 
    改成 return this.age==p3.age && this.name.equals(p3.getName());