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

項目の点数を比較したい。しかし、スコアが同じ場合は、名前で並べ替えたいと思います。

何を変更する必要があり、なぜこのエラーが発生するのですか?

編集:

スコアは an int、アイテム名は aStringです。

これは 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>:

クラス C の自然順序付けは、e1 ごとに (e1.compareTo((Object)e2) == 0) が e1.equals((Object)e2) と同じブール値を持つ場合にのみ、equals と一致すると言われます。およびクラス C の e2。

そして、compareTo を使用するために、API はさらに次のように述べています。

自然な順序付けが equals と一致することを強くお勧めします (必須ではありません)。これは、明示的な比較子のないソートされたセット (およびソートされたマップ) が、自然な順序付けが equals と矛盾する要素 (またはキー) で使用されると、「奇妙な」動作をするためです。特に、そのようなソート済みセット (またはソート済みマップ) は、equals メソッドに関して定義されているセット (またはマップ) の一般規約に違反しています。

したがって、equals と一貫性を保つためにおそらく equals をオーバーライドするcompareTo()必要scoregetItemName()あり e1.compareTo((Object)e2) == 0)ますe1.equals((Object)e2)

于 2012-10-23T14:29:05.517 に答える