我一直在:比较方法违反了它的一般合同!当我调用Arrays.sort(ScreenItems)时,下面的比较函数有例外
我有一个假设是下面的ParseInt为左对象抛出异常而不是向右对象抛出异常
那可能是这样吗?
public int compare(Object o1, Object o2) {
if (o2 == null || o1 == null)
return 0;
if (!(o1 instanceof ScreenItem) || !(o2 instanceof ScreenItem))
return 0;
ScreenItem item1 = (ScreenItem) o1;
ScreenItem item2 = (ScreenItem) o2;
String subSystem1 = item1.getSubSystem();
String subSystem2 = item2.getSubSystem();
if(subSystem1.equals(subSystem2)) {
return 0;
} else if(subSystem1.startsWith(subSystem2)) {
return 1;
} else if (subSystem2.startsWith(subSystem1)) {
return -1;
}
String order1 = item1.getOrder();
String order2 = item2.getOrder();
if (order1 == null || order2 == null){
String name1 = item1.getName();
String name2 = item2.getName();
if(name1 == null || name2 == null)
return 0;
return name1.compareToIgnoreCase(name2);
}
try {
return Integer.parseInt(order1) - Integer.parseInt(order2);
} catch (Exception ex) {
return 0;
}
}
答案 0 :(得分:4)
这是我认为需要的那种变化的一个例子。正如@CommuSoft在评论中指出的那样,null
和o1
的当前o2
处理方式打破了传递性。
我会替换:
if (o2 == null || o1 == null)
return 0;
使用:
if (o2 == null && o1 == null)
return 0;
if (o1 == null)
return -1;
if (o2 == null)
return 1;
这将null
视为等于自身,但少于所有非空引用。当然,只要您保持一致,您也可以选择将null
视为大于所有非空引用。如果有任何两个非空引用返回非零值,则将其视为等于所有内容(如当前代码中所做的那样)并不一致。
更一般地说,我建议为订购编写一套规则,确保它们符合Comparator
合同,然后编写代码和测试以匹配这些规则。