首页 > 解决方案 > 比较法违反其使用日期的一般合同例外

问题描述

我在下面使用一个简单的比较器按比赛的开始时间进行排序,但我收到错误“比较方法违反其一般合同”,即使我涵盖了所有可能性。对我所缺少的有任何帮助吗?

    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;
        }
    });

标签: javasortingcollectionscomparator

解决方案


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

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

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


推荐阅读