为什么我的比较方法抛出异常 - 比较法违反了一般的合同! [英] why does my compare method throw exception -- Comparison method violates its general contract!

查看:185
本文介绍了为什么我的比较方法抛出异常 - 比较法违反了一般的合同!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么这code

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异常:比较法违反其总承包
ERROR / AndroidRuntime(4446):在java.util.TimSort.mergeLo(TimSort.java:743)

throw this exception: ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)

该方法sre.getSponsored()返回一个布尔值。

The method sre.getSponsored() returns a boolean.

感谢。

推荐答案

我怀疑当的没有的值赞助出现问题。这将返回1无论你叫它,即

I suspect the problem occurs when neither value is sponsored. That will return 1 whichever way you call it, i.e.

x1.compare(x2) == 1

x2.compare(x1) == 1

这是无效的。

我建议你改变这一点:

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

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

在这两个地方。我可能会的实际上的提取该用的地方这种签名的方法:

in both places. I would probably actually extract this out a method with this signature somewhere:

public static int compare(boolean x, boolean y)

然后调用它是这样的:

and then call it like this:

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

这将使code更清晰,海事组织。

That will make the code clearer, IMO.

这篇关于为什么我的比较方法抛出异常 - 比较法违反了一般的合同!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆