Java 收集期间发生异常。sort()

Java 收集期间发生异常。sort(),java,collections,comparator,Java,Collections,Comparator,Ajava.lang.IllegalArgumentException:比较方法违反了它的一般约定。 我还没有找到不遵守合同的原因。 如果有人知道原因,最好解释一下 这是我正在使用的比较器: public int compare(ISimulationResultSet r1, ISimulationResultSet r2) { final float r1Esperance = r1.getResults().getEsperanceGainOuPerte(); final floa

A
java.lang.IllegalArgumentException:比较方法违反了它的一般约定ISimulationResultSet
列表执行
Collections.sort()
操作时,会抛出code>。 我还没有找到不遵守合同的原因。 如果有人知道原因,最好解释一下

这是我正在使用的比较器:

public int compare(ISimulationResultSet r1, ISimulationResultSet r2) {
final float r1Esperance = r1.getResults().getEsperanceGainOuPerte();
    final float r2Esperance = r2.getResults().getEsperanceGainOuPerte();

    final float r1PrctCibleAtteinte = r1.getResults().getPrctCibleAtteinte();
    final float r2PrctCibleAtteinte = r2.getResults().getPrctCibleAtteinte();

    if (r1Esperance / r2Esperance > 1.05F)
         return -1;

    else if (r1Esperance / r2Esperance < 0.95F) {
         return 1;
    }

    else {

        if (r1PrctCibleAtteinte == r2PrctCibleAtteinte) {
            if (r1Esperance > r2Esperance)
               return -1;

             else if (r1Esperance < r2Esperance)
               return 1;

            return 0;
        }

        else if (r1PrctCibleAtteinte > r2PrctCibleAtteinte)
        return -1;

        else if (r1PrctCibleAtteinte < r2PrctCibleAtteinte)
        return 1;

    }
    return 0;
}
public int比较(ISimulationResultSet r1、ISimulationResultSet r2){
最终浮点r1Esperance=r1.getResults().getEsperanceGainOuPerte();
最终浮点r2Esperance=r2.getResults().getesperance增益输出();
最终浮点r1prctcibleattente=r1.getResults().getprctcibleattente();
最终浮点r2prctcibleattente=r2.getResults().getprctcibleattente();
如果(r1Esperance/r2Esperance>1.05F)
返回-1;
否则如果(r1Esperance/r2Esperance<0.95F){
返回1;
}
否则{
如果(r1prctcibleattente==r2prctcibleattente){
if(r1世界语>r2世界语)
返回-1;
else if(r1世界语r2prctcibleattent)
返回-1;
否则如果(r1prctcibleattent
比较器必须是对称的,即
sgn(compare(x,y))==-sgn(compare(y,x))
sgn
是这里的符号函数)。您的比较器并非如此:

a1
a2
分别表示
x.getResults().getesperancegainoperte()
y.getResults().getesperancegainoperte()
的值,让
b1
b2
分别表示
x.getResults().getPrctCibleAtteinte()和
y.getResults()的值.getPrctCibleAtteinte()

现在考虑以下内容:

1.05 < a1 < 1.052

a2 = 1

b2 > b1 

这违反了合同。

比较器必须是对称的,即
sgn(compare(x,y))===-sgn(compare(y,x))
sgn
是这里的符号函数)。您的比较器并非如此:

a1
a2
分别表示
x.getResults().getesperancegainoperte()
y.getResults().getesperancegainoperte()
的值,让
b1
b2
分别表示
x.getResults().getPrctCibleAtteinte()和
y.getResults()的值.getPrctCibleAtteinte()

现在考虑以下内容:

1.05 < a1 < 1.052

a2 = 1

b2 > b1 

这违反了约定。

考虑显示更多内容——如何创建要排序的实体,如何调用排序、堆栈跟踪等…1/0.95=1.0526。。。所以我猜比较是模糊的。移动
返回0在最后一条else语句中。这几乎总是表示一个可传递的比较循环,通常是因为某些默认行为返回0,试图表示“不可比较”,但其中a==b和b==c,但a=考虑更多的显示-你是如何创建要排序的实体,如何调用排序,堆栈跟踪等等…1 / 0.95=1.0526…所以我猜比较是模糊的。移动
返回0在最后一条else语句中。这几乎总是表示一个可传递的比较循环,通常是因为某些默认行为返回0,试图表示“不可比较”,但其中a==b和b==c,但a=c、 费边,谢谢你的示范。我现在明白这个问题了。答案很快就被接受了;-),抱歉:)费边,谢谢你的示范。我现在明白这个问题了。答案很快就被接受了;-),对不起:)