使用 comparable 来比较不同的变量

Using comparable to compare different variables

我熟悉使用 Comparable 接口的标准比较,尽管今天我在比较几个不同的变量时遇到了一些麻烦。

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

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

我收到错误 "Comparison method violates its general contract!"。我想澄清一下,我不需要帮助来理解这个错误的含义,因为我已经阅读了几个关于它的问题。虽然,我仍然无法解决这个特定问题,因为我读过的其他问题的解决方案都是微不足道的。

我真的很感激在这个比较中得到一些帮助,这将是一个救命稻草。任何输入也非常感谢。

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

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

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

您的代码仍然违反了类似可交换的比较规则,即

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

看看"Comparison C":

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

which returns 1. 这个的逆应该 return -1,但它不是,因为我们在 "Comparison H":

中找到了逆
}else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {

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