条件空对象:比较方法违反其一般合同

时间:2017-09-22 11:03:31

标签: java algorithm sorting collections comparator

方案

我有一个具有startDateendDate的对象。如果两者都是not null 将设置timeDiff,在Long中计算这两个日期之间的时差。

使用案例

timeDiff的所有对象应该是第一个,最后一个。

比较

HFehlerProtPairComparator

if (sortFieldName.equals(HFehlerProtPairFields.EREIGNISDATUM_DIFFERENZ.getName())) {
            if (null != firstO.getStartDate() && null != firstO.getEndDate()
                    && null != secondO.getStartDate() && null != secondO.getEndDate()) {
                compare = firstO.getTimeDiff().compareTo(secondO.getTimeDiff());
            } else {
                compare = -1;
            }

        }

我不知道我错过了什么,调试在这里没有帮助我。我尝试在纸上验证它,我也不会在那里看到我的错误。

调用层次结构

comp = new HFehlerProtPairComparator(field.getName(), SortType.ASC.name());
Error ==> Collections.sort(unsortedHFehlerProtPairList, comp);

堆栈

at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeForceCollapse(TimSort.java:457)
at java.util.TimSort.sort(TimSort.java:254)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at uebergreifendeereignis.UeHFehlerProtPairListController.sortBySortMap(UeHFehlerProtPairListController.java:360)

2 个答案:

答案 0 :(得分:2)

如果你有一个既没有设置startDate也没有设置endDate的对象,你将它与自身进行比较,你的比较器给出-1作为结果。结果应该是0,因为一个对象本身不应该小于它。

答案 1 :(得分:2)

问题在于,在某些情况下,当比较A和B时,以及将B与A进行比较时,代码会返回-1。例如,假设您有没有开始日期的对象A和对象B,没有结束日期。现在,当使用参数列表(A, B)调用比较器时,它返回-1,表示A小于B。

但是稍后,可能会使用参数列表(B, A)调用比较器。它也返回-1,意味着B<甲

这违反了比较国的合同。规则说如果比较器为(A,B)返回-1,那么它必须为(B,A)返回1。也就是说,如果A< B,然后B>答:您的代码不符合该合同。

要使代码生效,您必须确定在未定义开始或结束时间时比较时间差异的含义。如果A.startDate为null,则timeDiff未定义。如果B具有有效的时间差异,则应将B视为大于,等于或小于A?

与我之前的回答一样,您有几个需要考虑的条件。

A.timeDiff  B.timeDiff    result
 undefined   undefined    equal
 undefined   valid        ??
 valid       undefined    ??
 valid       valid        A.timeDiff.compareTo(B.timeDiff)

由您来决定当一个或另一个未定义时结果应该是什么。但无论你做什么,最终的代码都必须遵守合同。