Java 比较法违反了其使用日期的一般合同例外情况

Java 比较法违反了其使用日期的一般合同例外情况,java,sorting,collections,comparator,Java,Sorting,Collections,Comparator,我在下面使用一个简单的比较器来按比赛开始时间排序,但得到的错误是“比较方法违反了它的总合同”,尽管我涵盖了所有的可能性。有什么能帮我的忙吗 Collections.sort(contests, new Comparator<Contest>() { @Override public int compare(Contest o1, Contest o2) { if (o1.getStartTime() != null &a

我在下面使用一个简单的比较器来按比赛开始时间排序,但得到的错误是“比较方法违反了它的总合同”,尽管我涵盖了所有的可能性。有什么能帮我的忙吗

    Collections.sort(contests, new Comparator<Contest>() {
        @Override
        public int compare(Contest o1, Contest o2) {
            if (o1.getStartTime() != null && o2.getStartTime() != null) {
                if (o1.getStartTime().getTime() < o2.getStartTime().getTime()) {
                    return -1;
                }
                return 1;
            } 
            return 1;
        }
    });
Collections.sort(竞赛、新比较器(){
@凌驾
公共整数比较(竞赛o1、竞赛o2){
如果(o1.getStartTime()!=null和&o2.getStartTime()!=null){
如果(o1.getStartTime().getTime()
如果您在Java 8上运行,您可以使用:

List<Contest> sorted = contests.stream()
            .sorted(Comparator.comparing(contest -> contest.getStartTime().getTime(), Comparator.nullsFirst(Comparator.naturalOrder())))
            .collect(Collectors.toList());
输出:

1
2
3

我没有看到它返回0的任何情况。进一步看,当比较两个具有相同开始时间的对象时,返回值为1。 因此,违反了本合同的以下规则:

sgn(compare(x, y)) == -sgn(compare(y, x)) 

如果x和y具有相同的开始时间。新加坡元(1)!=-sgn(1)。在这种情况下,该方法必须返回0。

什么数据时间是开始时间?什么是
getTime()
的返回类型?添加来自竞赛的相关代码可能有助于检查文档-第2段-或Stefan的
sgn(compare(x, y)) == -sgn(compare(y, x))