Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较法违反其总合同——如何避免_Java_Sorting_Exception_Illegalargumentexception_Timsort - Fatal编程技术网

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
提供了一些实用方法,可以将非空对象的比较器转换为处理空对象的比较器,将它们放在第一位或最后。

我无法重现您的错误。请你的问题提供一个能证明你的问题的答案。我无法重现你的错误。请你的问题提供一个能证明你的问题的答案。