Java 爪哇7-“;比较法违反其总合同&引用;

Java 爪哇7-“;比较法违反其总合同&引用;,java,collections,comparable,Java,Collections,Comparable,看起来一切都正常(好几天),但我只遇到过一次问题,很难重现这个问题 “比较法违反了它的总合同!”被抛到一边,完全让我措手不及。我有以下资料: public class CustomComparator implements Comparator<Chromosome> { public int compare(Chromosome c1, Chromosome c2){ return c1.compareTo(c2); } } 公共类CustomComparator

看起来一切都正常(好几天),但我只遇到过一次问题,很难重现这个问题

“比较法违反了它的总合同!”被抛到一边,完全让我措手不及。我有以下资料:

public class CustomComparator implements Comparator<Chromosome> {

public int compare(Chromosome c1, Chromosome c2){

    return c1.compareTo(c2);
}

} 
公共类CustomComparator实现Comparator{
公共整数比较(染色体c1,染色体c2){
返回c1。比较(c2);
}
} 
我的染色体类别:

public class Chromosome implements Comparable<Chromosome>{

private double rank;

//bunch of methods...

@Override public int compareTo(Chromosome c){

    final int BEFORE = -1;
    final int EQUAL = 0;
    final int AFTER = 1;

    if (this.getRank() == c.getRank()) //getRank() simply returns a double value 'rank'
        return EQUAL;

    else if (this.getRank() < c.getRank())
            return BEFORE;

    else  //i.e. (this.getRank() > c.getRank())
        return AFTER;   

}
公共类{
私人双职级;
//一堆方法。。。
@覆盖公共整数比较(染色体c){
之前的最终整数=-1;
最终整数等于0;
之后的最终整数=1;
if(this.getRank()==c.getRank())//getRank()只返回一个双精度值'rank'
回报相等;
else if(this.getRank()c.getRank())
返回后;
}

我有一个ArrayList,我使用了Collections.sort(MyList)和Collections.sort(MyList,Collections.reverseOrder())。到目前为止,它们仍然工作正常。在运行的100次中,我只遇到过一次该错误。此实现是否有问题?

可能您的一个参数是正无穷大或负无穷大,即除以零。也不要依赖==双值。您应该使用:

return Double.compare(this.getRank(), c.getRank());

您的一个参数可能是由于正无穷大或负无穷大,即除以零。也不要依赖==双精度值。您应该使用:

return Double.compare(this.getRank(), c.getRank());

Java 7稍微改变了排序算法的行为。现在,如果检测到违反
compareTo
方法的一般约定,它们会抛出异常。例如,您可以阅读该约定的属性

一般来说,它可能会被违反,例如,如果它将解析为a 如果要使用旧的行为,可以使用以下方法:

public class CustomComparator implements Comparator<Chromosome> {

public int compare(Chromosome c1, Chromosome c2){

    return c1.compareTo(c2);
}

} 
System.setProperty(“java.util.Arrays.useLegacyMergeSort”,“true”);

但我不鼓励您这样做。您应该通过将实现更改为双重比较的标准实现。此实现正确处理双重比较的无穷大和NaN值


此外,如果您的
比较器
只是委托给
compareTo
方法,则通常可以放弃该方法。

Java 7稍微改变了其排序算法的行为。如果检测到违反
compareTo
方法的一般约定,则会引发异常。您可以阅读有关该方法的内容例如,ntract的属性

一般来说,它可能会被违反,例如,如果它将解析为a 如果要使用旧的行为,可以使用以下方法:

public class CustomComparator implements Comparator<Chromosome> {

public int compare(Chromosome c1, Chromosome c2){

    return c1.compareTo(c2);
}

} 
System.setProperty(“java.util.Arrays.useLegacyMergeSort”,“true”);

但我不鼓励您这样做。您应该通过将实现更改为双重比较的标准实现。此实现正确处理双重比较的无穷大和NaN值



此外,如果您的
比较器
只是委托给
compareTo
方法,则通常可以放弃它。

是否有任何双值NaN?可能是
0.0/0.0
或类似的结果。您的compareTo方法也可以是,
返回double.compare(this.rank,c.rank)
。由于自定义比较器在染色体实例本身上调用了
compareTo
,因此它是无用的。是否可能秩为NaN?NaN既不大于、小于或等于NaN。请参阅以获取解释。是否有任何双值NaN?可能是
0.0/0.0
或类似的结果。还有您的com帕累托方法可以是,
返回Double.compare(this.rank,c.rank)
。您的自定义比较器是无用的,因为它在染色体实例本身上调用了
compareTo
。秩是否可能是NaN?NaN既不大于、小于或等于NaN。有关解释,请参阅。感谢有关Double.compare()的提示使用它可能更有意义。它不可能是被零除的问题。秩只是基于图像像素值(int介于0和255之间)的神经网络返回的值。神经网络使用的是一个sigmoid函数。很高兴它有帮助。请通过接受答案来结束此问题,以便它可以帮助其他人解决类似问题。感谢有关Double.compare()的提示使用它可能更有意义。它不可能是被零除的问题。秩只是基于图像像素值(int介于0和255之间)的神经网络返回的值。神经网络使用了一个s形函数。很高兴它有帮助。请通过接受答案来结束这个问题,这样它可以帮助其他类似问题的人。谢谢。我将使用Double.compare()相反。我没有再遇到这个问题,所以这很奇怪。而且,我不确定我是否理解你给出的违反合同的例子。我怎么能有两个双值a和b,这样a