当前位置: 首页 > 知识库问答 >
问题:

Java 7-“比较方法违反了它的一般约定!”

应向晨
2023-03-14

一切似乎都运行良好(几天),但我只遇到了一次问题,并且很难重现该问题。

“比较方法违反了其总合同!”被抛出,完全让我措手不及。我有以下几点:

public class CustomComparator implements Comparator<Chromosome> {

public int compare(Chromosome c1, Chromosome c2){

    return c1.compareTo(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;   

}

我有一个ArrayList,我使用了两个Collections。排序(MyList)和集合。排序(MyList,Collections.reverseOrder())。到目前为止,他们仍在正常工作。我在100次跑步中只遇到过一次错误。这个实现有什么问题吗?

共有2个答案

饶德本
2023-03-14

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

return Double.compare(this.getRank(), c.getRank());
吕冠宇
2023-03-14

Java 7稍微改变了排序算法的行为。现在,如果检测到违反< code>compareTo方法的一般约定,它们将引发异常。例如,你可以在这里阅读合同的属性。

一般来说,它可能会被违反,例如,如果它将解决一个

如果您想使用旧行为,可以使用以下方法:

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

但我不鼓励你这么做。您应该通过<code>double将实现更改为双重比较的标准实现。比较(a,b)。这个实现正确地处理了double的无穷大和NaN值。

此外,如果您的比较器只是委托给comareTo方法,则通常可以将其丢弃。

 类似资料:
  • 问题内容: 您好,以下是我的比较器的比较方法。我不确定是什么问题。我在堆栈溢出时查找了其他类似标题的问题和答案,但不确定我的方法有什么问题,但我一直在获取java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 任何帮助将不胜感激 添加我得到的异常 问题答案: 您的方法 不是可 传递的 。如果和,则必须等于。 现在考虑这种情况: 对于,和,假设方法返回以下

  • 使用自定义比较器执行< code > Collection.sort using >时,我得到一个< code > Java . lang . illegalargumentexception:Comparison方法违反了它的一般约定 我理解这是一个问题,因为该方法是不可传递的。在我的比较器中,调用了多个方法,我确定了违反此规则的代码段。然而,我无法修复它,也看不到它的问题。

  • 嗨,下面是我的比较器的比较方法。我不知道哪里出了问题。我查了关于堆栈溢出的其他类似标题的问题和答案,但不确定我的方法有什么问题,但我不断得到java.lang.IllegalArgument异常:比较方法违反了它的一般合同! 任何帮助将不胜感激 添加我得到的异常

  • 有人能解释一下为什么我下面的比较器有时候会抛出上面的异常吗? 注意:myObject 中的 id 字段类型为 long。 解决方案: 基于@amit的回答

  • 我想通过dateLastContact比较两个“收件人”,如果相同,就通过地址进行比较。这是我的代码: 而且我总是有这个错误: 我尝试了很多方法,但是现在,我不知道该怎么办。你能帮我吗? 收件人类别:

  • 首先,很抱歉再次就这个话题提问。我很清楚这里有很多问题和答案。我已经读了其中的一些,但我的问题是我仍然不知道我做错了什么。这是我的代码: 看来我只是瞎了眼,看不到我的错误,所以如果你们中有人能帮我解决这个问题,我将非常感谢。 编辑:我想做的是确定一条线在左上角有0/0坐标的坐标系中是上、下、最左还是最右。这些点是double类型的。下面是错误消息: