【发布时间】: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;
}
【问题讨论】:
-
您知道您的代码违反了 Comparable 的一般合同(可能是由于传递性规则失败),那么它就不能用于排序。时期。您的问题可能是XY Problem,您在其中询问如何解决特定代码问题,而最佳解决方案是使用完全不同的方法。最好告诉我们您正在尝试解决的总体问题,而不是您当前尝试解决的方式。
-
@HovercraftFullOfEels 这不仅仅是这个特定的问题,我以前也遇到过类似的问题,似乎可以通过类似的方式解决它们
标签: java libgdx comparison comparator comparable