gpt4 book ai didi

java - 比较方法违反了其一般契约

转载 作者:行者123 更新时间:2023-12-01 11:21:17 27 4
gpt4 key购买 nike

我已经在类上实现了 Comaprable,它给了我 Comparison 方法违反了它的一般契约! ,由于有一些值返回为 null ,代码如下

公共(public)静态比较器NameComparator =新的比较器(){

    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;
}

}

};

最佳答案

这确实是违反契约(Contract)的行为。来自 Comparator API :

It follows immediately from the contract for compare that the quotient is an equivalence relation on S, and that the imposed ordering is a total order on S.

一个total order是传递的、反对称的、全的。

但是您的代码施加的顺序是不可传递的。如果 x 和 y 具有非空值且 x < y 但 z 具有空值,则:

比较(x,z)= 0。比较(y,z)= 0。因此,根据传递属性,compare(x,y) 应该为零,但事实并非如此。

一种可能的解决方案是将 null 值视为最低值。

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

关于java - 比较方法违反了其一般契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31200736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com