按日期排序。比较器。Java

5

下面这段代码摘自Java教程,比较第二个参数对象与第一个对象而不是相反。 *方法hireDate()返回表示特定雇员的入职日期的日期对象。

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

请注意,Comparator将其第二个参数的入职日期传递给第一个参数而不是相反。原因是最近雇用的员工是最低级别的;按照入职日期排序会将列表按照反向资历顺序排列。

我仍然不明白通过在compareTo中交换e1和e2可以解决问题的原因。

有进一步的说明吗?

提前致谢。

3个回答

10

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

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

不要随意操纵 Comparator。


这帮助我将工作量减少了一半.. 谢谢。 - VPK

8

自然日期顺序(由compareTo定义)是较晚的日期“大于”较早的日期。对于资历,已经在那里工作时间更长的人更资深,即您希望较早的开始日期表示比后来的日期更高的资历。

由于Comparator的契约规定,如果compare(a,b)!= 0,则compare(a,b)compare(b,a)必须具有相反的符号,因此您有两个选择用于实现ab的反向排序比较-要么返回-(a.compareTo(b))b.compareTo(a)-它们保证具有相同的符号。

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


是的,但是你如何事先知道哪一个更旧呢?难道不应该是一样的吗? - Rollerball
最终计算的是由方法用户输入的内容。 - Rollerball
@Rollerball,我不明白你在问什么。你在问题中提供的代码片段只是定义了一个比较器的方式,可以接受两个员工并告诉你哪一个更资深,通过选择hireDate()更早的那个来实现,它并没有“计数”任何东西。 - Ian Roberts
我不明白为什么e2.hireDate().compareTo(e1.hireDate())与e1.hireDate().compareTo(e2.hireDate())不同很重要。我事先不知道这两个对象中哪一个更老或更年轻(在资历方面)。我可能会得到compareTo的正值或负值。 - Rollerball
1
@Rollerball 如果你有一个员工列表,并使用比较器对其进行排序,比如 e1.hireDate().compareTo(e2.hireDate()),那么你会得到按照资历从高到低(即反向资历)排序的结果。如果你使用 e2.hireDate().compareTo(e1.hireDate()) 进行排序,则会得到按照资历从低到高排序的结果。 - Ian Roberts

0

Comparator的compare方法期望在e1<e2e1==e2e1>e2时返回-1、0或1。因此,如果您得到的最终顺序只是所需顺序的相反,那么简单地反转a和b就可以解决问题。


是的,但是您如何事先确定哪一个更旧?难道不应该是相同的吗? - Rollerball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接