从this 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());
}
};
以下是java教程解释:
请注意,比较者传递其第二个参数的雇用日期 到第一个而不是反之。原因是该员工 最近被雇用的人是最不高级的;按顺序排序 雇用日期会将该名单列为反向资历。
我仍然不明白为什么通过反转compareTo
中的e1和e2它应该解决问题。
进一步澄清?
提前致谢。
答案 0 :(得分:7)
如果要更改排序顺序,请使用:
Collections.sort(list, Collections.reverseOrder(comparator));
不要与比较器一起玩。
答案 1 :(得分:6)
日期的自然顺序(由compareTo
定义)是较晚的日期“大于”早期的日期。对于资历来说,在那里待的人越长越高级,即你希望早期的开始日期表示比后者更高的资历。
由于Comparator
的合同规定,如果compare(a,b) != 0
然后compare(a,b)
和compare(b,a)
必须符号相反,那么您有两种方法可以实现反向排序比较a
和b
- 返回-(a.compareTo(b))
或b.compareTo(a)
- 保证它们具有相同的符号。
它们不一定具有相同的值,但对比较器结果唯一重要的是它们是>
,<
还是==
到0 - 虽然许多示例使用-1
,0
和+1
任何带正确符号的值都可以。
答案 2 :(得分:0)
如果compare
,e1<e2
或e1==e2
,则比较器的e1>e2
方法需要返回-1,0或1。因此,如果您获得的最终顺序只是所需的反转,只需反转a和b即可解决问题。