IllegalArgumentException:比较方法违反了它的一般合同
IllegalArgumentException : Comparison method violates it's general contract
以下是我的比较器:
class CostComparator implements Comparator<Index> {
@Override
public int compare(Index itemIndex1, Index itemIndex2) {
return Grid[itemIndex1.x][itemIndex1.y].cost >
Grid[itemIndex2.x][itemIndex2.y].cost ? 1 : -1;
}
}
上面的网格是项目索引的二维数组。我有一些内存方面的考虑,因此我在网格中存储索引而不是项目。
比较方法获取索引并比较这些索引处的项目成本。
简单地说,如果两个索引具有相同的成本,则违反了比较。它 应该 return 0,但它会 return -1。作为 微不足道的 违规,这意味着 compare(index, index)
将始终 return -1,当它 必须 return 0.
虽然修复起来真的很容易:
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
Grid[itemIndex2.x][itemIndex2.y].cost);
(将 Integer
更改为 cost
的任何类型。)
您错过了两个值都是 equals
的情况
return Grid[itemIndex1.x][itemIndex1.y].cost >
Grid[itemIndex2.x][itemIndex2.y].cost ? 1 : -1;
应该改为
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
Grid[itemIndex2.x][itemIndex2.y].cost);
有关如何实施的详细信息,请参阅 documentation。
此外,您可能希望在进行比较之前检查可能的 null
值。
以下是我的比较器:
class CostComparator implements Comparator<Index> {
@Override
public int compare(Index itemIndex1, Index itemIndex2) {
return Grid[itemIndex1.x][itemIndex1.y].cost >
Grid[itemIndex2.x][itemIndex2.y].cost ? 1 : -1;
}
}
上面的网格是项目索引的二维数组。我有一些内存方面的考虑,因此我在网格中存储索引而不是项目。
比较方法获取索引并比较这些索引处的项目成本。
简单地说,如果两个索引具有相同的成本,则违反了比较。它 应该 return 0,但它会 return -1。作为 微不足道的 违规,这意味着 compare(index, index)
将始终 return -1,当它 必须 return 0.
虽然修复起来真的很容易:
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
Grid[itemIndex2.x][itemIndex2.y].cost);
(将 Integer
更改为 cost
的任何类型。)
您错过了两个值都是 equals
return Grid[itemIndex1.x][itemIndex1.y].cost >
Grid[itemIndex2.x][itemIndex2.y].cost ? 1 : -1;
应该改为
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
Grid[itemIndex2.x][itemIndex2.y].cost);
有关如何实施的详细信息,请参阅 documentation。
此外,您可能希望在进行比较之前检查可能的 null
值。