按日期订购。比较器。JAVA

按日期订购。比较器。JAVA,java,arguments,comparator,Java,Arguments,Comparator,下一个片段取自java教程,它将第二个参数对象与第一个对象进行比较,而不是相反。 *方法hireDate()返回一个日期对象,表示该特定员工的雇用日期 import java.util.*; public class EmpSort { static final Comparator<Employee> SENIORITY_ORDER = new Comparator<Employee&g

下一个片段取自java教程,它将第二个参数对象与第一个对象进行比较,而不是相反。 *方法hireDate()返回一个日期对象,表示该特定员工的雇用日期

import java.util.*;
public class EmpSort {
    static final Comparator<Employee> SENIORITY_ORDER = 
                                        new Comparator<Employee>() {
            public int compare(Employee e1, Employee e2) {
                return e2.hireDate().compareTo(e1.hireDate());
            }
    };
import java.util.*;
公共类EmpSort{
静态最终比较者资历\u顺序=
新比较器(){
公共整数比较(员工e1、员工e2){
返回e2.hireDate().compareTo(e1.hireDate());
}
};
以下是java教程的说明:

请注意,比较器传递其第二个参数的雇用日期 而不是相反。原因是员工 最近被雇用的人是资历最低的;按顺序排列 雇佣日期的改变将使名单按与资历相反的顺序排列

我仍然不明白为什么通过在
比较中反转e1和e2来解决这个问题

有进一步的澄清吗


提前感谢。

Comparator的
compare
方法希望在
e1e2
的情况下返回-1、0或1。因此,如果您得到的最终顺序正好与所需顺序相反,只需将a和b反转即可解决问题。

日期的自然顺序(由
compareTo
定义)是较晚的日期“大于”较早的一个。对于资历,在那里工作的时间越长的人资历越高,即,您希望较早的开始日期表示比较晚的日期更高的资历

由于
Comparator
的契约规定,如果
compare(a,b)!=0
那么
compare(a,b)
compare(b,a)
必须有相反的符号,因此对于如何实现
a
b
的逆序比较,您有两种选择-返回
-(a.compareTo(b))
b.与(a)
相比,它们保证具有相同的符号


它们不一定具有相同的值,但对比较器结果而言唯一重要的是它们是否为
,如果要更改排序顺序,请使用:

Collections.sort(list, Collections.reverseOrder(comparator));

不要玩比较器。

是的,但你如何事先知道哪个比较器更老?它是否应该是相同的?是的,但你如何事先知道哪个比较器更老?它是否应该是相同的?最后它会计算方法用户输入的内容。@Rollerball我不明白你在问什么。你在这个问题只是定义一个比较器的一种方式,它可以容纳两名员工,并告诉您哪一位更高级,通过选择一个具有较早的
hireDate()
,它不会“计算”任何东西。我不明白为什么e2.hireDate().compareTo(e1.hireDate())与e1.hireDate()不同。我事先不知道这两个对象中哪个更年长或更年轻(根据资历)。我可以从compareTo中得到正值或负值。@Rolleball,如果您有一个员工列表,并使用一个比较器对该列表进行排序,该比较器执行了
e1.hireDate().compareTo(e2.hireDate())
然后你会把它们从最高级到最高级排序(即按与资历相反的顺序)。如果你按
e2.hireDate().compareTo(e1.hireDate())
排序,你会把它们从最高级到最高级排序。这有助于将我的努力减少一半。谢谢。