4

取自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教程解释:

请注意,比较器将其第二个参数的雇用日期传递给其第一个参数,而不是反之。原因是最近聘用的员工资历最低;按雇用日期的顺序排序将使列表以相反的资历顺序排列。

我仍然不明白为什么通过反转 e1 和 e2compareTo应该可以解决问题。

有什么进一步的说明吗?

提前致谢。

4

3 回答 3

11

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

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

不要玩比较器。

于 2013-04-02T16:22:52.630 回答
7

日期的自然顺序(由 定义compareTo)是较晚的日期“大于”较早的日期。对于资历,在那里待得越久的人资历越高,也就是说,您希望较早的开始日期表示比较晚的人资历更高。

由于合同Comparator规定如果compare(a,b) != 0then compare(a,b)andcompare(b,a)必须具有相反的符号,您有两种选择来实现aand的反向排序比较b- 要么返回,-(a.compareTo(b))要么b.compareTo(a)- 它们保证具有相同的符号。

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

于 2013-04-02T16:16:54.837 回答
0

如果、或,比较器的compare方法期望返回 -1、0 或 1 。因此,如果您得到的最终订单与期望的相反,只需反转 a 和 b 即可解决问题。e1<e2e1==e2e1>e2

于 2013-04-02T16:04:56.130 回答