我们编写了以下代码,这些代码不适用于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)
Comparator当两种类型相等时,您的初始实现会因未正确处理(即返回0)而违反s 的一般合约.
而不是试图自己实现两个整数之间的比较逻辑,为什么不让它Integer做最好的事情呢?
return Integer.compare(a.getType(), b.getType());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |