我有一个具有startDate
和endDate
的对象。如果两者都是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)
答案 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)
由您来决定当一个或另一个未定义时结果应该是什么。但无论你做什么,最终的代码都必须遵守合同。