gpt4 book ai didi

java - 为什么我的比较方法会抛出异常——比较方法违反了它的一般契约!

转载 作者:太空狗 更新时间:2023-10-29 22:59:10 26 4
gpt4 key购买 nike

为什么这段代码

public class SponsoredComparator implements Comparator<SRE> {

public boolean equals(SRE arg0, SRE arg1){
return arg0.getSponsored()==arg1.getSponsored();
}

public int compare(SRE object1, SRE object2) {
Log.d("SponsoredComparator","object1.getName() == "+ object1.getName());
Log.d("SponsoredComparator","object1.getSponsored() == "+ object1.getSponsored());
Log.d("SponsoredComparator","object2.getName() == "+ object2.getName());
Log.d("SponsoredComparator","object2.getSponsored() == "+ object2.getSponsored());
Log.d("SponsoredComparator","compare return == "+ (object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1));
return object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1;
}
}

抛出这个异常:ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!<br/>
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)

方法 sre.getSponsored() 返回一个 boolean 值。

谢谢。

最佳答案

我怀疑当没有值(value)被赞助时会出现问题。无论你怎么调用它,它都会返回 1,即

x1.compare(x2) == 1

x2.compare(x1) == 1

那是无效的。

我建议你改变这个:

object1.getSponsored() && object2.getSponsored()

object1.getSponsored() == object2.getSponsored()

两个地方。我可能实际上将其提取出一个在某处具有此签名的方法:

public static int compare(boolean x, boolean y)

然后这样调用它:

public int compare(SRE object1, SRE object2) {
return BooleanHelper.compare(object1.getSponsored(), object2.getSponsored());
}

这将使代码更清晰,IMO。

关于java - 为什么我的比较方法会抛出异常——比较方法违反了它的一般契约!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626437/

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