按日期排序.比较.Java的

Rol*_*all 4 java arguments comparator

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

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());
            }
    };
Run Code Online (Sandbox Code Playgroud)

这是java教程的解释:

请注意,比较者将其第二个参数的雇用日期传递给第一个参数,而不是反之亦然.原因是最近雇用的员工是最不高级的; 按雇用日期顺序排序会使列表按反向资历顺序排列.

我仍然不明白为什么通过反转e1和e2来compareTo解决这个问题.

还有进一步澄清吗?

提前致谢.

cam*_*ckr 7

如果要更改排序顺序,请使用:

Collections.sort(list, Collections.reverseOrder(comparator));
Run Code Online (Sandbox Code Playgroud)

不要与比较器一起玩.


Ian*_*rts 6

日期的自然顺序(由定义compareTo)是后一个日期"大于"早期日期.对于资历来说,在那里待的人越长越高级,即你希望较早的开始日期表示比后者更高的资历.

由于国家的合同Comparator,如果compare(a,b) != 0当时compare(a,b)compare(b,a)必须有相反的标志,你有两个选择如何实现逆向有序比较ab- 或者返回-(a.compareTo(b))b.compareTo(a)- 它们保证具有相同的符号.

它们不一定具有相同的,但对于比较器结果而言唯一重要的是它们是>,<或者==是0 - 而许多示例使用-1,0并且+1具有正确符号的任何值都可以.