首页 >Java >java教程 >为什么我的 Java `compareTo` 方法违反了一般契约?

为什么我的 Java `compareTo` 方法违反了一般契约?

Susan Sarandon
Susan Sarandon原创
2024-12-15 02:13:17809浏览

Why Does My Java `compareTo` Method Violate the General Contract?

错误:Java 的compareTo 方法违反了一般契约

遇到“比较方法违反了其一般契约”错误可能会令人沮丧。尽管进行了广泛的研究,许多开发人员仍难以解决此问题。

当 Java 中用于比较对象的compareTo 方法违反传递性要求时,就会出现此错误。传递性规定,如果 A 大于 B 并且 B 大于 C,则 A 必须大于 C。

在提供的代码片段中,实现了 CollectionItems 的自定义比较器,但包含导致以下错误的错误违反传递性。

错误 1:

if (card1.getRarity() < card2.getRarity()) {
  return 1;
}

这里,如果card1.getRarity()大于card2.getRarity(),正确的返回值应该是-1,而不是1。

错误2:

if (card1.getId() == card2.getId()) {
  //...
}
return -1;

当ID不相等时,如果card1.getId()小于card2.getId(),正确的返回值应该是-1,或者如果 card1.getId() 更大,则为 1。

修订的比较器:

为了解决这些错误,这里是遵循传递性的比较器的修改版本:

if (card1.getSet() > card2.getSet()) {
    return 1;
}
if (card1.getSet() < card2.getSet()) {
    return -1;
};
if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
if (card1.getId() > card2.getId()) {
    return 1;
}
if (card1.getId() < card2.getId()) {
    return -1;
}
return cardType - item.getCardType();  //watch out for overflow!

以上是为什么我的 Java `compareTo` 方法违反了一般契约?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn