Java对象根据多个属性实现去重

在Java中,我们经常会遇到需要对对象列表进行去重的情况。通常情况下,我们可以通过重写对象的equals()hashCode()方法来实现去重。但是有时候,我们需要根据对象的多个属性来去重,这就需要我们自定义去重的规则。

为什么需要根据多个属性去重

假设我们有一个Person类,包含nameage两个属性,我们希望根据nameage来去重。如果我们只重写equals()hashCode()方法,那么只能根据其中一个属性来去重,无法满足我们的需求。

如何根据多个属性去重

为了实现根据多个属性去重,我们可以自定义一个Comparator来实现我们的去重规则。我们需要重写equals()hashCode()方法,同时实现Comparator接口。

下面是一个示例代码:

import java.util.Objects;

public class Person {
    private String name;
    private int age;

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

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

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

import java.util.Comparator;

public class PersonComparator implements Comparator<Person> {

    @Override
    public int compare(Person p1, Person p2) {
        if (p1.getName().equals(p2.getName()) && p1.getAge() == p2.getAge()) {
            return 0;
        }
        return -1;
    }
}

在上面的代码中,我们定义了Person类,包含nameage两个属性。我们重写了equals()hashCode()方法,同时实现了Comparator接口,自定义了PersonComparator类来实现我们的去重规则。

测试去重功能

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice", 25));
        persons.add(new Person("Bob", 30));
        persons.add(new Person("Alice", 25));
        persons.add(new Person("Alice", 25));

        List<Person> distinctPersons = persons.stream()
                .distinct()
                .sorted(new PersonComparator())
                .collect(Collectors.toList());

        for (Person person : distinctPersons) {
            System.out.println(person.getName() + " " + person.getAge());
        }
    }
}

在上面的代码中,我们创建了一个Person对象列表,包含了一些重复的对象。通过使用stream()distinct()方法来去重,同时使用自定义的PersonComparator类来实现去重规则。最后,我们打印出去重后的结果。

总结

通过自定义Comparator来实现根据多个属性去重,可以满足我们更加灵活的需求。在实际开发中,根据具体的业务场景,我们可以根据不同的属性来实现去重规则,从而更好地处理对象去重的问题。希望本文的内容对你有所帮助,谢谢阅读!

类图

classDiagram
    class Person {
        -String name
        -int age
        +Person(String name, int age)
        +String getName()
        +int getAge()
        +boolean equals(Object o)
        +int hashCode()
    }
    class PersonComparator {
        +int compare(Person p1, Person p2)
    }

通过以上类图可以清晰地看到Person类和PersonComparator类之间的关系,以及它们各自的属性和方法。

文章结束。感谢阅读!