gpt4 book ai didi

java - 使用 comparable 来比较不同的变量

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:19 24 4
gpt4 key购买 nike

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

我基本上想实现一个仅当以下 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.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,但它不会,因为我们在“比较 H”中找到了逆运算:

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

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

关于java - 使用 comparable 来比较不同的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30824837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com