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解决这个问题.
还有进一步澄清吗?
提前致谢.
如果要更改排序顺序,请使用:
Collections.sort(list, Collections.reverseOrder(comparator));
Run Code Online (Sandbox Code Playgroud)
不要与比较器一起玩.
日期的自然顺序(由定义compareTo)是后一个日期"大于"早期日期.对于资历来说,在那里待的人越长越高级,即你希望较早的开始日期表示比后者更高的资历.
由于国家的合同Comparator,如果compare(a,b) != 0当时compare(a,b)和compare(b,a)必须有相反的标志,你有两个选择如何实现逆向有序比较a和b- 或者返回-(a.compareTo(b))或b.compareTo(a)- 它们保证具有相同的符号.
它们不一定具有相同的值,但对于比较器结果而言唯一重要的是它们是>,<或者==是0 - 而许多示例使用-1,0并且+1具有正确符号的任何值都可以.