【问题标题】:Comparison method violates its general contract, how to make it transitive?比较方法违反了它的总契约,如何使其具有传递性?
【发布时间】:2014-05-21 16:13:31
【问题描述】:

我不明白它是如何不传递,请有人建议我正确的方法。 如果两个值都是null

我返回 0,其他两个语句很明显。

为什么我得到IllegalArgumentException比较法违反其总合同

我的比较方法:(我比较双打)

@Override
public int compare(HashMap<String, String> lhs, HashMap<String, String> rhs) {

    double dist1 = 0;
    double dist2 = 0;

    int compInt1 = 0;
    int compInt2 = 0;

    if (lhs.get("dist") != null && rhs.get("dist") != null && !lhs.get("dist").equals("") && !rhs.get("dist").equals("")) {

        dist1 = Double.parseDouble(lhs.get("dist").substring(0, lhs.get("dist").length() - 3));
        dist2 = Double.parseDouble(rhs.get("dist").substring(0, rhs.get("dist").length() - 3));

        dist1 = dist1 * 100;
        dist2 = dist2 * 100;

        compInt1 = (int) dist1;
        compInt2 = (int) dist2;

    }

    if (compInt1 < compInt2) {
        return -1;
    } else if (compInt1 >= compInt2) {
        return 1;
    } else {
        return 0;
    }

}

【问题讨论】:

  • if both values are null I return 0 不,你没有

标签: java android comparator


【解决方案1】:

看看这段代码:

if (compInt1 < compInt2) {
    return -1;
} else if (compInt1 >= compInt2) {
    return 1;
} else {
    return 0;
}

您如何期望它返回 0? compInt1compInt2 的哪些值会使 两个 if 条件失败?

这也违反了对称性 - 这意味着 compare(x, y)compare(y, x) 都可以返回 1...

假设此时您真的只是想以明显的方式比较 compInt1compInt2,只需将整个块替换为:

// As of Java 7...
return Integer.compare(compInt1, compInt2);

如果您使用的是 Java 6(或更早版本),您可以使用:

return Integer.valueOf(compInt1).compareTo(compInt2);

有点效率低下,但至少值得一开始使用,只是为了让一切正常工作。

此外,我强烈建议从您的第一部分中提取 lhs.get("dist")rhs.get("dist") 表达式 - 目前它非常重复。只需在块内声明 dist1dist2 - 它们不会在其他地方使用。

【讨论】:

  • 我不排除它,我在堆栈上读到这是解决这个问题的必要条件,实际上它没有解决。
  • @Adam:你使用的是哪个版本的 Java?
  • @AdamVarhegyi:顺便说一句,我不知道你的第一条评论是什么意思。
  • 这是一条错误消息,顺便说一句,我尝试过:return Integer.valueOf(compInt1).compareTo(Integer.valueOf(compInt2));没有解决。
  • @AdamVarhegyi:exact 错误消息是什么。我敢肯定,这不仅仅是“未解决”,甚至不是有效的英语。
【解决方案2】:

条件else if (compInt1 &gt;= compInt2) 不明确,因为即使两个值相等,它也会返回值 1。将 int 的比较逻辑替换如下:

 return compInt1  - compInt2;

【讨论】:

    【解决方案3】:

    传递性定义为:

    compare(a, b) == -compare(b, a)
    

    这意味着compare(a, a) == -compare(a, a) == 0

    现在,考虑到您的代码,

    compare(a, a) == 1
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多