如何从我的ArrayList中删除也在Java中的其他ArrayList中的对象?

时间:2017-03-12 15:24:20

标签: java arraylist

在我的java代码中,我有一个结构Person

public class Person {
  String name;
  String distance;
  String address;
  String field1;
  String field2;
}

现在,我有一个包含几个对象的ArrayList<Person> people。我还有另一个包含其他对象的ArrayList<Person> otherPeople

我想制作一个第3个列表,其中包含people中尚未包含的所有otherPeople对象。

但我只需要按namedistanceaddress比较对象,我不关心field1field2的值

我考虑过创建2个for循环:

for (Person newPerson: people) {
   for (Person oldPerson: otherPeople) {
       if(newPerson.getName().equals(oldPerson.getName()) &&
         newPerson.getDistance().equals(oldPerson.getDistance()) &&
         newPerson.getAddress().equals(oldPerson.getAddress()) {

但我不知道如何继续,特别是因为我无法从我正在迭代的列表中删除元素... 你能帮帮我吗?

3 个答案:

答案 0 :(得分:5)

你可以覆盖Person类的相等方法吗? 然后,您将能够使用方法remove或removeAll从集合中删除person。

class Person {
        String name;
        String distance;
        String address;
        String field1;
        String field2;

        @Override
        public boolean equals(Object o) {
            if (this == o)
                return true;
            if (o == null || getClass() != o.getClass())
                return false;
            Person person = (Person) o;
            return Objects.equals(name, person.name) &&
                    Objects.equals(distance, person.distance) &&
                    Objects.equals(address, person.address);
        }

        @Override
        public int hashCode() {
            return Objects.hash(name, distance, address);
        }
    }

    class Example {
       public static void main(String[] args) {
            Person person1 = new Person();
            person1.address = "address_1";
            person1.distance = "distance_1";
            person1.name = "name_1";
            person1.field1 = "field1_1";
            person1.field2 = "field2_2";

            Person person2 = new Person();
            person2.address = "address_2";
            person2.distance = "distance_2";
            person2.name = "name_2";
            person2.field1 = "field1_2";
            person2.field2 = "field2_2";

            ArrayList<Person> people = new ArrayList<>(Arrays.asList(person1, person2));
            System.out.println(people);
            ArrayList<Person> otherPeople = new ArrayList<>(Arrays.asList(person1));
            people.removeAll(otherPeople);
            System.out.println(people);
        }
    }

答案 1 :(得分:1)

您可以尝试以下方式:

public static void main(String[] args) {

    ArrayList<Person> people = new ArrayList<>();
    ArrayList<Person> otherPeople = new ArrayList<>();

    ArrayList<Person> peopleDistinct = new ArrayList<>(people);

    peopleDistinct.removeAll(otherPeople);

}

但首先,您必须为equals类重新定义Person方法。

编辑:这是一个如何覆盖equals方法的示例:

@Override 
public boolean equals(Object other) {

    boolean result = false;

    if (other instanceof Person) {

        Person that = (Person) other;
        result = (this.name == that.name && this.distance == that.distance && this.address == other.address);
    }

    return result;
}

注意:如果等号函数需要field1field2,则应添加{。}}。

答案 2 :(得分:0)

  1. 在Person类中实现equals()和hashcode()方法,并将哈希码计算为名称,距离,地址的函数。有关更多详细信息,您可以搜索如何编写好的哈希函数。请记住,在equals方法中,如果两个对象具有相同的名称,距离和地址值,则会编写将两个对象视为相等的逻辑。但是,不要忘记实现hashcod(),因为在使用hashset和hashmap时不实现它可能会有进一步的复杂性。

  2. 然后以你已经开始的方式使用for循环比较每个人的对象。