首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalArgumentException :比较法违反了它的一般合同

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

Stack Overflow用户
提问于 2015-02-09 17:36:18
回答 2查看 59关注 0票数 0

以下是我的比较者:

代码语言:javascript
复制
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;
    }
}

上面的Grid是一个项目索引的2D数组。我有一些内存方面的考虑,因此我要在网格中存储索引而不是条目。

比较方法取指标,并比较各指标的成本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-09 17:38:10

简单地说,如果两个索引的成本相同,就违反了比较。它应该返回0,但它将返回-1。这意味着,当compare(index, index)必须返回0时,它总是返回-1。

不过,它确实很容易修复:

代码语言:javascript
复制
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
    Grid[itemIndex2.x][itemIndex2.y].cost);

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

票数 4
EN

Stack Overflow用户

发布于 2015-02-09 17:39:11

您忽略了两个值都是equals的情况。

代码语言:javascript
复制
return Grid[itemIndex1.x][itemIndex1.y].cost >
        Grid[itemIndex2.x][itemIndex2.y].cost ? 1 : -1;

应改为

代码语言:javascript
复制
return Integer.compare(Grid[itemIndex1.x][itemIndex1.y].cost,
    Grid[itemIndex2.x][itemIndex2.y].cost);

有关如何实现的更多信息,请参见文档

此外,在进行比较之前,您可能需要检查可能的null值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28415809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档