当前位置: 首页 > 知识库问答 >
问题:

比较法违反其总合同

严易安
2023-03-14

我已经在类上实现了Comaprable,它给了我比较方法违反了它的总合同!,由于有一些值返回为 null,代码如下

公共静态比较器名称比较器 = 新比较器() {

    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个答案

皇甫智明
2023-03-14

事实上,这是违反合同的行为。从比较器API:

从比较合约中可以立即得出,商是 S 上的等价关系,而强加的排序是 S 上的全序。

全序是传递的、反对称的和全序。

但是代码所施加的顺序是不可传递的。如果x和y具有非空值且x

比较 (x,z) = 0。比较 (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);
      }
  }
 类似资料:
  • 我试图使用比较器基于两个字符串的比较对数组列表进行排序,但我最终使用的比较方法违反了它的一般契约错误。如果字符串中出现空值比较,我该如何处理? 密码 错误

  • 我从上面得到了一个例外,我知道这里经常讨论SO。无论如何,其他人不会告诉我我的代码有什么问题。这些只是音乐专辑返回最后一首歌曲被添加到Android的MediaStore的时间,以毫秒为单位。这只在某些设备上发生! 代码:

  • 我有一个类 ,它看起来像这样: 接下来,我有<代码>列表 其中和是当前位置的纬度和经度。有时,代码会抛出异常 我知道,如果方法不满足传递条件,则会抛出此异常。我在这里找到了一些信息:比较方法违反了其总合同!我理解为什么在引用的问题中抛出异常,但我仍然不知道为什么在我的代码中抛出异常。 你能帮我一下吗?谢了。 更新 的列表用于的适配器。如果有新的GPS位置,则对中的数据进行排序。代码如下所示: 和方

  • 我收到以下错误:“比较方法违反了它的一般合同!”当使用下面的比较器时,我无法使用jUnit复制异常。我想知道是什么导致了这个问题,以及如何复制它。有其他人也有同样的问题,但不知道如何复制。 使用以下方法调用该代码: 感谢任何帮助。 额外信息:该错误似乎发生在Java utils中的TimSort类中,并来自一个名为mergeLo的方法。链接:http://grepcode.com/file/rep

  • 我目前正在Java中对集合进行排序。我收到了错误消息“比较方法违反了它的一般契约”。我也理解这个错误消息,但我(主要)使用Long类型的构建比较方法。所以我不知道,在这种情况下,排序方法仍然违反了契约。这是我的代码: 这里是错误:

  • 我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。