比较者不工作

Vin*_*rma 1 java comparator

我们编写了以下代码,这些代码不适用于Comparator比较方法.

public int compare(Object o1, Object o2)
{
    if (o2 == null) return 1;
    else if (o1 == null) return -1;

    MailObject a = (MailObject)o1;
    MailObject b = (MailObject)o2;
    return a.getType() < b.getType()? 1 : -1;
}
Run Code Online (Sandbox Code Playgroud)

其中getType()方法返回一个整数值.以下代码工作正常

public int compare(Object o1, Object o2)
{
    if (o2 == null) return 1;
    else if (o1 == null) return -1;

    MailObject a = (MailObject)o1;
    MailObject b = (MailObject)o2;
    return a.getType() - b.getType();
}
Run Code Online (Sandbox Code Playgroud)

如果我们在return语句中删除三元运算符,那么它工作正常.如果我们添加相同的检查,那么它也工作正常.为什么?

第一个代码块给出以下异常:

07:45:22 ERROR c.c.servlet.MyServlet - Comparison method violates its general contract!
java.lang.IllegalArgumentException: Comparison method violates its general contract!
               at java.util.TimSort.mergeHi(Unknown Source) ~[na:1.8.0_25]
               at java.util.TimSort.mergeAt(Unknown Source) ~[na:1.8.0_25]
               at java.util.TimSort.mergeCollapse(Unknown Source) ~[na:1.8.0_25]
               at java.util.TimSort.sort(Unknown Source) ~[na:1.8.0_25]
               at java.util.Arrays.sort(Unknown Source) ~[na:1.8.0_25]
               at java.util.List.sort(Unknown Source) ~[na:1.8.0_25]
               at java.util.Collections.sort(Unknown Source) ~[na:1.8.0_25]
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 7

Comparator当两种类型相等时,您的初始实现会因未正确处理(即返回0)而违反s 的一般合约.

而不是试图自己实现两个整数之间的比较逻辑,为什么不让它Integer最好的事情呢

return Integer.compare(a.getType(), b.getType());
Run Code Online (Sandbox Code Playgroud)