一尘不染

Java 如何按多个字段比较对象

java

假设你有一些具有多个字段的对象,可以通过以下方式进行比较:

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()等)比较混乱。
    那么最好的方法是什么?

阅读 1346

收藏
2020-02-27

共2个答案

一尘不染

你可以实现Comparator比较两个Person对象的,并且可以根据需要检查任意多个字段。你可以在比较器中放入一个变量,以告知要与哪个字段进行比较,尽管编写多个比较器可能会更简单

2020-02-27
一尘不染

使用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);

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

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