有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IllegalArgumentException:比较方法违反了它的一般约定

以下是我的比较:

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数组。我有一些内存方面的考虑,因此我在网格中存储索引而不是项

比较法采用指数,并在这些指数下比较项目的成本


共 (2) 个答案

  1. # 1 楼答案

    缺少两个值都为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

  2. # 2 楼答案

    简单地说,如果两个索引具有相同的成本,那么它违反了比较。它应该返回0,但它将返回-1。作为一个微不足道的违规,这意味着compare(index, index)将始终返回-1,而它必须返回0

    不过,修复起来真的很容易:

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

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