我已经在课堂上实现了Comaprable,它给了我比较方法违反了它的一般合同! ,因为有些值返回为null,代码如下
public static Comparator NameComparator = new Comparator(){
public int compare(JSONReceiptList rName1, JSONReceiptList rName2) {
if(rName1.retailer!=null || rName2.retailer!=null) {
if(rName1.retailer==null||rName2.retailer==null) {
return 0;
}
else
{
if(rName1.retailer.retailerName==null ||rName2.retailer.retailerName==null ) {
return 0;
}
else
{String Name1 = rName1.retailer.getRetailerName().toUpperCase();
String Name2 = rName2.retailer.getRetailerName().toUpperCase();
return Name1.compareTo(Name2);
}
}
//ascending order
}
else
{
return 0;
}
}
};
答案 0 :(得分:1)
确实是合同违规。 来自Comparator API:
紧跟比较合同后,商是S上的等价关系,强加的排序是S的总订单。
total order是传递的,反对称的和总的。
但是您的代码强加的顺序不具有传递性。如果x和y具有非空值并且x <0。 y但是z具有空值:
compare(x,z)= 0. compare(y,z)= 0。 因此,对于传递属性,compare(x,y)应该为零,但情况并非如此。
一种可能的解决方案是将空值视为最低值。
public int compare(JSONReceiptList rName1, JSONReceiptList rName2) {
boolean r1IsNull = rName1.retailer==null || rName1.retailer.retailerName==null;
boolean r2IsNull = rName2.retailer==null || rName2.retailer.retailerName==null;
if ( r1IsNull && r2IsNull )
return 0;
else if ( r1IsNull && !r2IsNull )
return -Integer.MAX_VALUE;
else if ( !r1IsNull && r2IsNull )
return Integer.MAX_VALUE;
else // Both are non null
{
String name1 = rName1.retailer.getRetailerName().toUpperCase();
String name2 = rName2.retailer.getRetailerName().toUpperCase();
return name1.compareTo(name2);
}
}