如何按多个字段比较对象

新手上路,请多包涵

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

 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() 等…)很混乱。

那么最好的方法是什么?

原文由 Yuval Adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您可以实施一个 Comparator 比较两个 Person 对象,并且您可以检查任意多个字段。您可以在比较器中放入一个变量,告诉它要与哪个字段进行比较,尽管只编写多个比较器可能会更简单。

原文由 Elie 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Display Name 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题