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 值。