按日期排序。比较。 Java的

时间:2013-04-02 16:01:26

标签: java arguments comparator

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它应该解决问题。

进一步澄清?

提前致谢。

3 个答案:

答案 0 :(得分:7)

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

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

不要与比较器一起玩。

答案 1 :(得分:6)

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

由于Comparator的合同规定,如果compare(a,b) != 0然后compare(a,b)compare(b,a)必须符号相反,那么您有两种方法可以实现反向排序比较ab - 返回-(a.compareTo(b))b.compareTo(a) - 保证它们具有相同的符号。

它们不一定具有相同的,但对比较器结果唯一重要的是它们是><还是==到0 - 虽然许多示例使用-10+1任何带正确符号的值都可以。

答案 2 :(得分:0)

如果comparee1<e2e1==e2,则比较器的e1>e2方法需要返回-1,0或1。因此,如果您获得的最终顺序只是所需的反转,只需反转a和b即可解决问题。