比较方法违反了其总合同

时间:2015-07-03 07:11:45

标签: java android

我已经在课堂上实现了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;
        }

    }

};

1 个答案:

答案 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);
      }
  }