【问题标题】:Using comparable to compare different variables使用可比较来比较不同的变量
【发布时间】:2015-06-14 00:17:12
【问题描述】:

我熟悉使用 Comparable 界面进行标准比较,但今天我想比较几个不同的变量时遇到了一些麻烦。

我基本上想实现一个 compareTo 方法,仅当以下 if 语句为真时才产生结果 -1

if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ)

虽然,我不确定这是否可以使用可比较的,或者我只是不像看起来那样熟悉它。因为当我尝试这种方法时

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ){
        return -1;
    }else if(o.maxX < minX && o.maxY < minY && o.minZ > maxZ){
        return 1;
    }
    return 0;
}

我收到错误“比较方法违反了它的一般合同!”。我想澄清一下,我不需要帮助来理解这个错误的含义,因为我已经阅读了几个关于它的问题。虽然,我仍然无法解决这个特定的问题,因为我读过的其他问题的解决方案都是微不足道的。

我非常感谢您对这个比较的帮助,这将是一个救生员。任何意见也非常感谢。

编辑:经过测试,我得到了一些几乎可以工作的东西(并非在所有情况下),但我不知道为什么:

public int compareTo(IsoSprite o) {
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) {
        return -1;
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {
        return 1;
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    }else if(this != o){
        return 1;
    }
    return 0;
}

【问题讨论】:

  • stackoverflow.com/questions/8327514/… 最佳答案可能有用
  • 您知道您的代码违反了 Comparable 的一般合同(可能是由于传递性规则失败),那么它就不能用于排序。时期。您的问题可能是XY Problem,您在其中询问如何解决特定代码问题,而最佳解决方案是使用完全不同的方法。最好告诉我们您正在尝试解决的总体问题,而不是您当前尝试解决的方式。
  • @HovercraftFullOfEels 这不仅仅是这个特定的问题,我以前也遇到过类似的问题,似乎可以通过类似的方式解决它们

标签: java libgdx comparison comparator comparable


【解决方案1】:

如果您使用它对对象进行排序,那么您的 Comparable 或 Comparator 必须表现良好,并且必须遵守传递性和其他规则。如果没有,那么您的代码已损坏。建议您的比较方法与 equals 一致,这意味着当且仅当 a.equals(b) 时 a.compareTo(b) 返回 0,但与已删除答案中所述不同,这不是绝对要求.

您的代码仍然打破了比较规则,即

a.compareTo(b) == -b.compareTo(a)

让我们看看你的规则:

public int compareTo(IsoSprite o) {
    // Comparison A
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) {
        return -1;
    // Comparison B
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    // Comparison C
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {
        return 1;
    // Comparison D
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison E
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    // Comparison F
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison G
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) {
        return 1;
    // Comparison H
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {
        return 1;
    // Comparison I
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) {
        return 1;
    // Comparison J
    }else if(this != o){
        return 1;
    }
    return 0;
}

看“比较C”:

}else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {

它返回 1。它的反面应该返回 -1,但它没有,因为我们在 "Comparison H" 中找到了反面:

}else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {

但它也返回 1。因此这里(可能还有其他地方)a.compareTo(b) 不等于 b.compareTo(a) 的 -。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多