2016-06-08 70 views
0

我目前正面临一个问题,它不会删除我在remove方法中提供的项目。删除Arraylist中与删除方法中的对象对应的所有项目

ArrayList<Person> persons = new ArrayList<>(); 

persons.add(new Person(1,"john","london")); 
persons.add(new Person(1,"john","london")); 
persons.add(new Person(1,"john","london")); 
persons.add(new Person(1,"john","london")); 
persons.add(new Person(2,"blaze","paris")); 
persons.add(new Person(2,"blaze","paris")); 

persons.remove(new Person(1,"john","london")); 

即使我已经删除了一个项目,Arraylist的大小仍然保持不变。 如何删除对应于我放入remove方法内的对象的所有项目?

回答

0

这很糟糕,或者您发布的信息不完整。 若要从列表中删除一个项目,你需要2的一个选项:

  1. 传递给remove函数的引用您要删除(而不是一个新的对象)的对象。
  2. 在Person类的列表中使用equals函数来查找应删除哪个元素。
1

List.remove()方法将扫描列表试图找到一个对象,它是等同于你在传递的一个。当你这样做:

persons.add(new Person(1,"john","london")); 

您添加了一个名为约翰·伦敦在新Person对象记忆中的某个地方。当你打电话

persons.remove(new Person(1,"john","london")); 

你问的Java搜索名为John伦敦位于内存中的不同位置Person对象。 Java找不到这个对象,因此列表的大小保持不变。

要传达出梅梅,下面if比较将使用默认equals()方法从Object继承返回false

Person p1 = new Person(1, "john", "london"); 
Person p2 = new Person(1, "john", "london"); 
if (p1.equals(p2)) { 
    System.out.println("they are equal"); 
} 

你应该做的:

如果你想两个人在一起相同的ID和名称被认为是相等的,那么你将不得不超过Person类的equals()方法:

class Person { 
    private String firstName; 
    private String lastName; 
    private int id; 

    @Override 
    public boolean equals(Object o) { 
     if ((o == null) || (getClass() != o.getClass())) { 
      return false; 
     } 

     Person other = (Person)o; 
     boolean result = firstName.equals(other.firstName) && 
         lastName.equals(other.lastName) && 
         id == other.id; 
     return result; 
    } 
} 
0

首先@ @im Biegeleisen指出你应该重写Person.equals()

然后,你可以做一个新的方法,找到符合你的条件的人。

private List<Person> findPersons(ArrayList<Person> persons, Person personToMatch) { 
    List<Person> personsFound = new ArrayList<>(); 
    for (Person person : persons) { 
     if (person.equals(personToMatch) { 
      personsFound.add(person); 
     } 
    } 
    return personsFound; 
} 

最后,你可以拨打:

List<Person> personsToRemove = findPersons(persons, new Person(1,"john","london")); 
persons.removeAll(personsToRemove);