我收到以下错误:
比较方法违反了其总合同!
这是我的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;
}
我想比较一下这些项目的得分。但是当得分相同时,我想按名称对它们进行排序。
我需要更改什么以及为什么会出现此错误?
编辑:
得分为int
,商品名为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;
}
答案 0 :(得分:4)
来自Comparable<T>
的Java API:
C类的自然排序据说是一致的 等于当且仅当(e1.compareTo((Object)e2)== 0)具有相同的值时 对于C类的每个e1和e2,布尔值为e1.equals((Object)e2)。
为了使用compareTo,api进一步说:
强烈建议(尽管不要求)自然 排序与平等一致。这是因为排序集 没有显式比较器的(和排序的地图)表现得“奇怪” 它们与自然顺序的元素(或键)一起使用 与equals不一致。特别是,这样的排序集(或排序的 map)违反了定义的集合(或映射)的一般合同 就平等方法而言。
所以你应该重写equals以与compareTo()
保持一致,因为否则两个不同的对象e1和e2具有相同的score
和getItemName()
将具有e1.compareTo((Object)e2) == 0)
但不会e1.equals((Object)e2)
。