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

compareTo error比较方法违反了其一般约定

澹台星光
2023-03-14

我收到以下错误:

比较方法违反了其总合同!

这是我的比较法

public int compareTo(ComparableItem another) {
     if (this.score == another.score)
        return this.getItemName().compareTo(another.getItemName());
     else if ((this.score) > another.score)
        return 1;
     else
        return -1;
}

我想比较项目的分数。但是当分数相同时,我想按名称对它们进行排序。

我需要更改什么,为什么会出现这个错误?

编辑:

分数是一个int,itemname一个String

这是 ComparableItem 类:

public abstract class ComparableItem extends MenuListItem implements Comparable<ComparableItem> {

protected int score;

public ComparableItem(String itemID, String itemName) {
    super(itemID, itemName);
}

public int compareTo(ComparableItem another) {
     if (this.score == another.score)
        return this.getItemName().compareTo(another.getItemName());
     else if ((this.score) > another.score)
        return 1;
     else
        return -1;
}

public abstract boolean found(String criteria);

这是MenuList项目类:

public class MenuListItem {

private String itemID,itemName;

public MenuListItem(String itemID, String itemName){
    setItemID(itemID);
    setItemName(itemName);
}

public String getItemID() {
    return itemID;
}

public void setItemID(String itemID) {
    this.itemID = itemID;
}

public String getItemName() {
    return itemName;
}

public void setItemName(String itemName) {
    this.itemName = itemName;
}

@Override
public String toString() {
    return this.itemName;
}

共有1个答案

鲜于谦
2023-03-14

引用Comparable的Java API

当且仅当(e1.compareTo((Object)e2)==0)对于C类的每个e1和e2具有与e1.equals((Object)e2)相同的布尔值时,C类的自然排序被称为与equals一致。

对于使用compareTo,api进一步表示:

强烈建议(尽管不是必需的)自然排序与等于一致。之所以如此,是因为没有显式比较器的排序集合(和排序映射)在与自然顺序与等式不一致的元素(或键)一起使用时行为“奇怪”。特别是,这样的排序集合(或排序映射)违反了集合(或映射)的一般契约,该约定是根据 equals 方法定义的。

因此,您可能应该覆盖 equals 以与您的 compareTo() 保持一致,因为否则两个不同的对象 e1 和 e2 具有相等的分数和 getItemName() 将具有 e1.compareTo((Object)e2) == 0) 而不是 e1.equals((Object)e2)。

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

  • 我知道有很多问题与这个主题有关,但我不能完全理解是什么导致了这个错误 有人知道为什么它不起作用以及如何修复它吗?

  • 问题内容: 我有以下代码: 每次我运行此代码时,都会出现此错误: 我使用OpenJDK7u3,当对象相等时返回0。有人可以向我解释这个错误吗? 问题答案: 如果您有任何NaN值,则可能会遇到这种情况: 例如: 所有 这些打印。因此,您可能会遇到以下两种情况:两个非NaN值都被认为与NaN“相等”,但是一个大于另一个。基本上,您应该弄清楚如何处理NaN值。当然,还要检查这确实是问题所在……您是否真的

  • 我们的一些用户在排序列表时遇到了这个异常。抛出它的代码是 而 getTime() 的类型为 “long”

  • 问题内容: 我看到了很多与此有关的问题,并试图解决该问题,但是经过一个小时的搜索和大量的试验和错误后,我仍然无法修复它。我希望你们中的一些人能抓住问题。 这是我得到的: 这是我的比较器: 任何想法? 问题答案: 异常消息实际上是描述性的。这里所指的合同是传递:如果和那么对于任意的。我用纸和铅笔检查了一下,你的代码似乎有几个孔: 如果你不返回。 如果id不相等,则返回。你应该返回-1或1根据哪个ID

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