IllegalArgumentException:比较方法违反了它的一般合同

时间:2015-02-09 17:36:19

标签: java sorting collections

以下是我的比较者:

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

上面的网格是项目索引的2D数组。我有一些内存考虑因素,因为我在其中存储索引而不是Grid中的项目。

比较方法获取指数并比较这些指数的项目成本。

2 个答案:

答案 0 :(得分:4)

简单地说,如果两个索引具有相同的成本,则违反了比较。 应该返回0,但它将返回-1。作为普通违规,这意味着当{em>必须返回0时,compare(index, index)将始终返回-1。

虽然很容易解决:

return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
    Grid[itemIndex2.x][itemIndex2.y].cost);

(将Integer更改为cost的任何类型。)

答案 1 :(得分:2)

您错过了两个值均为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值。