如何通过多个字段比较对象

2022-08-31 05:09:39

假设您有一些对象,它们有几个字段可以通过以下方式进行比较:

public class Person {

    private String firstName;
    private String lastName;
    private String age;

    /* Constructors */

    /* Methods */

}

因此,在本例中,当您询问以下情况时:

a.compareTo(b) > 0

你可能会问a的姓氏是否在b之前,或者a是否比b更老,等等......

在不增加不必要的混乱或开销的情况下,在这些类型的对象之间实现多重比较的最干净的方法是什么?

  • java.lang.Comparable界面仅允许通过一个字段进行比较
  • 在我看来,添加许多比较方法(即,等)是混乱的。compareByFirstName()compareByAge()

那么最好的方法是什么呢?


答案 1

使用 Java 8:

Comparator.comparing((Person p)->p.firstName)
          .thenComparing(p->p.lastName)
          .thenComparingInt(p->p.age);

如果您有访问器方法:

Comparator.comparing(Person::getFirstName)
          .thenComparing(Person::getLastName)
          .thenComparingInt(Person::getAge);

如果一个类实现了Compeable,那么这样的比较器可以在compareTo方法中使用:

@Override
public int compareTo(Person o){
    return Comparator.comparing(Person::getFirstName)
              .thenComparing(Person::getLastName)
              .thenComparingInt(Person::getAge)
              .compare(this, o);
}

答案 2

您应该实现 .假设所有字段都不会为 null(为简单起见),age 是一个 int,比较排名是第一个、最后一个、年龄,方法非常简单:Comparable <Person>compareTo

public int compareTo(Person other) {
    int i = firstName.compareTo(other.firstName);
    if (i != 0) return i;

    i = lastName.compareTo(other.lastName);
    if (i != 0) return i;

    return Integer.compare(age, other.age);
}