我如何比较有/没有迭代每个列表的两个列表

时间:2018-06-25 17:57:43

标签: java java-8

我如何比较上面的两个列表(是否对每个列表进行迭代)?我想在不对人员列表进行迭代的情况下比较人员列表。发生匹配时,它会打印匹配的对象,否则必须打印不匹配的对象。我不必重复第二个列表就可以做到这一点。

import java.util.*;

public class Person implements Comparable<Person> {
    String name;
    int age;
    String mail;

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public Person(String name, int age, String mail) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String toString() {
        return name + " : " + age;
    }

    public int compareTo(Person p) {
        return getMail().compareTo(p.getMail());
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null) {
            return false;
        }

        if (getClass() != obj.getClass()) {
            return false;
        }

        return false;
    }

    public static void main(String[] args) {
        List<Person> people = new ArrayList<Person>();

        people.add(new Person("Homer", 38, "shankar@gmail.com"));
        people.add(new Person("Marge", 35, "shankar6@gmail.com"));
        people.add(new Person("Bart", 15, "ramr@gmail.com"));
        people.add(new Person("Lisa", 13, "ramkumar@gmail.com"));

        System.out.println("\t" + people);

        List<Person> people1 = new ArrayList<Person>();

        people1.add(new Person("jug", 38, "jug@gmail.com"));
        people1.add(new Person("benny", 35, "benny@gmail.com"));
        people1.add(new Person("Bart", 15, "ramr@gmail.com"));
        people1.add(new Person("Lisa", 13, "ramkumar@gmail.com"));

        for (Person people : people) {
            if (people1.contains( people)) { 
                System.out.println("matched");
                System.out.println(people);
            } else {
                System.out.println("not matched");
                System.out.println(people);
            }
        }
    }
}

预期输出:

matched
Bart : 15 :ramr@gmail.com

3 个答案:

答案 0 :(得分:3)

首先,您需要正确实现<!DOCTYPE html> <html lang=""> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title></title> </head> <body> <img src="https://user-images.githubusercontent.com/13046668/41792152-165b8206-7682-11e8-8182-dad5d193b494.png" class="img"><!-- --><div class="container"> <div class="overline" style="clear: both">overline</div> <br> <div class="content" style="clear: both">superman is back</div> </div> </body> </html>方法。然后,您可以使用equals,它“仅保留此列表中指定集合中包含的元素(可选操作)。换句话说,从此列表中删除所有未包含在指定集合中的元素。 ”。

如果要将原始列表保留为以下内容,则将原始列表复制到某个列表:List#retainAll,然后可以使用copyofPeople。现在,如果copyofPeople.retainAll(people1)为空(copyofPeople),则没有共同的元素。

如果您的逻辑平等取决于对方的电子邮件,那么equals方法应如下所示:

copyofPeople.size()==0

答案 1 :(得分:1)

Collections具有:

people.retainAll(people1) // for intersection
people.addAll(people1) // for union

答案 2 :(得分:1)

如果您使用的是Java 8,那么您也可以为此使用流。

    for (Person p : people) {
            if(people1.stream().filter(i -> i.equals(p)).findFirst().isPresent()){
                System.out.println("matched");
                System.out.println(p);
            }
            else{
                System.out.println("not matched");
                System.out.println(p);
            }
     }

如果一个对象的所有属性都与另一个对象匹配,那么我在此处重写Person类中的equals方法以返回true。

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person p = (Person) obj;
        if(getName() == p.getName() && getAge() == p.getAge() && getMail() == p.getMail())
            return true;
        else
            return false;
    }