Dem*_*nth 5 java comparison comparable comparator libgdx
我熟悉使用Comparable接口的标准比较,虽然今天我想要比较几个不同的变量时遇到一些麻烦.
我基本上想要实现一个compareTo方法,只有在以下if语句为真时才产生结果-1:
if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ)
Run Code Online (Sandbox Code Playgroud)
虽然,我不确定这是否可能使用类似的,或者我只是不像它看起来那么熟悉.因为当我尝试这种方法时
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;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误"比较方法违反了其总合同!" .我想澄清一点,我不需要帮助理解这个错误意味着什么,因为我已经阅读了几个关于它的问题.虽然,我仍然不能把我的想法放在这个特定的问题上,因为我读过的其他问题的解决方案是微不足道的.
我真的很感激这种比较的一些帮助,它将是一个救生员.任何输入也很受欢迎.
编辑:经过测试后,我得到的东西几乎可以工作(并非在所有情况下),但我无法弄清楚原因:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用它来对对象进行排序,那么您的 Comparable 或 Comparator 必须表现良好,并且必须遵守传递规则和其他规则。如果没有,那么你的代码就被破坏了。建议您的比较方法与 equals 一致,这意味着当且仅当 a.equals(b) 时 a.compareTo(b) 返回 0,但与已删除答案中所述不同,这不是绝对要求。
您的代码仍然打破了类似交换的比较规则,即
a.compareTo(b) == -b.compareTo(a)
Run Code Online (Sandbox Code Playgroud)
让我们看看你的规则:
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;
}
Run Code Online (Sandbox Code Playgroud)
看“比较C”:
}else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) {
Run Code Online (Sandbox Code Playgroud)
它返回 1。它的逆函数应该返回 -1,但事实并非如此,因为我们在“比较 H”中找到了逆函数:
}else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) {
Run Code Online (Sandbox Code Playgroud)
但它也返回 1。因此,这里(也可能在其他地方)a.compareTo(b) 不等于 b.compareTo(a) 的 - 。