2

我收到以下错误:

比较方法违反了它的总合同!

这是我的 compareTo 方法

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;
}

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

我需要更改什么以及为什么会出现此错误?

编辑:

score 是 a int, itemname a 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);

这是 MenuListItem 类:

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;
}
4

1 回答 1

4

引用来自 Java API 的Comparable<T>

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

对于使用 compareTo,api 进一步说:

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

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

于 2012-10-23T14:29:05.517 回答