Java 比较法违反其总合同——如何避免
我知道对于这个问题可能有一些非常好的解释,但我仍然无法将其应用到我的代码中。在我的案例中,如何避免这个错误?这是我的密码:Java 比较法违反其总合同——如何避免,java,sorting,exception,illegalargumentexception,timsort,Java,Sorting,Exception,Illegalargumentexception,Timsort,我知道对于这个问题可能有一些非常好的解释,但我仍然无法将其应用到我的代码中。在我的案例中,如何避免这个错误?这是我的密码: sampleList.sort((o1, o2) -> { try { if (o1.getDate() == null || o2.getDate() == null) return 0; int i = new SimpleDateFormat("EEE MMM
sampleList.sort((o1, o2) -> {
try {
if (o1.getDate() == null || o2.getDate() == null) return 0;
int i = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy").parse(o1.getDate()).compareTo(new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy").parse(o2.getDate()));
return i;
} catch (ParseException e) {
logger.error("Sorting failed", e);
}
return 0;
});
sampleList是一个类型的列表,其中包含字符串中的日期。我得到一个例外:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.ArrayList.sort(Unknown Source)
at
如果你对如何解决这个问题有什么建议,请与我分享。谢谢。的javadoc说:
实施者必须确保compare(x,y)==0
意味着sgn(compare(x,z))==sgn(compare(y,z))
适用于所有z
您的实现未能满足合同的这一部分
如果您有x=null,y=1,z=2
,则“null等于任何东西”的实现意味着:
比较(x,y)=0//
// 0
sgn(compare(x,z))==sgn(compare(y,z))//违反了合同!
// 0 -1
的javadoc说:
实施者必须确保compare(x,y)==0
意味着sgn(compare(x,z))==sgn(compare(y,z))
适用于所有z
您的实现未能满足合同的这一部分
如果您有x=null,y=1,z=2
,则“null等于任何东西”的实现意味着:
比较(x,y)=0//
// 0
sgn(compare(x,z))==sgn(compare(y,z))//违反了合同!
// 0 -1
您的比较器无法正确处理空值和不可解析日期。考虑以下情况: 假设您有两个非空日期d1和d2以及一个空日期d3。 假设d1>d2 你就这样
d1 > d2
d1 == d3
d2 == d3
所以,如果d1和d2都等于d3,它们也应该相等,但它们不是
首先将所有字符串转换为日期或null
然后使用比较器,该比较器将所有空值视为大于(或小于)所有非空值
Comparator
有一些实用方法可以将非空对象的比较器转换为处理空值的比较器,方法是将它们放在第一位或最后。您的比较器无法正确处理空值和不可解析的日期。考虑以下情况:
假设您有两个非空日期d1和d2以及一个空日期d3。
假设d1>d2
你就这样
d1 > d2
d1 == d3
d2 == d3
所以,如果d1和d2都等于d3,它们也应该相等,但它们不是
首先将所有字符串转换为日期或null
然后使用比较器,该比较器将所有空值视为大于(或小于)所有非空值
Comparator
提供了一些实用方法,可以将非空对象的比较器转换为处理空对象的比较器,将它们放在第一位或最后。我无法重现您的错误。请你的问题提供一个能证明你的问题的答案。我无法重现你的错误。请你的问题提供一个能证明你的问题的答案。