Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等距排序的比较错误_Java_Sorting_Libgdx_Comparable_Isometric - Fatal编程技术网

Java 等距排序的比较错误

Java 等距排序的比较错误,java,sorting,libgdx,comparable,isometric,Java,Sorting,Libgdx,Comparable,Isometric,因此,我正在为我的精灵实现一个等距分类器,我在比较何时应该渲染瓷砖时遇到了一些问题。我正在对所有等轴测精灵进行排序,这些精灵将通过将它们实现为可比较来进行渲染 问题是,当我实现以下compareTo方法时: // 1 = render this after // 0 == render same // -1 = render this before @Override public int compareTo(IsoSprite o) { if(z >= o.z &&

因此,我正在为我的精灵实现一个等距分类器,我在比较何时应该渲染瓷砖时遇到了一些问题。我正在对所有等轴测精灵进行排序,这些精灵将通过将它们实现为可比较来进行渲染

问题是,当我实现以下compareTo方法时:

// 1 = render this after
// 0 == render same
// -1 = render this before
@Override
public int compareTo(IsoSprite o) {
    if(z >= o.z && maxY <= o.minY && maxX <= o.minX){
        return 1;
    }
    if(z >= o.z && maxY >= o.minY && maxX >= o.minX){
        return -1;
    }
    if(z > o.z){
        return 1;
    }
    if(z < o.z){
        return -1;
    }

    //z == o.z && maxY == o.maxY && minY == o.minY && minX == o.minX && maxX == o.maxX
    return 0;
}
//1=在
//0==渲染相同
//-1=在之前渲染此
@凌驾
公共整数比较(IsoSprite o){
如果(z>=o.z&&maxY=o.minY&&maxX>=o.minX){
返回-1;
}
如果(z>o.z){
返回1;
}
if(z
我从LibGDX数组(我用于排序)中的array.sort调用中得到错误“Comparison method invests its general contract!”。我不知道我应该如何解决这个问题,当我看到其他人的问题与这个错误,但这些问题大多是琐碎的。有人知道我应该如何在等距比较中解决这个问题吗

我的等轴测世界(供参考):

编辑: 仅按Z排序时发现一些有趣的内容:

//Doesn't work
public int compareTo(IsoSprite o) {

    if(maxZ > o.z){
        return 1;
    }
    if (maxZ < o.z){
        return -1;
    }
    return 0;
}

//Works
@Override
public int compareTo(IsoSprite o) {
    if(z > o.z){
        return 1;
    }
    if(z < o.z){
        return -1;
    }
    return 0;
}
//不起作用
公共整数比较(IsoSprite o){
如果(maxZ>o.z){
返回1;
}
如果(最大值o.z){
返回1;
}
if(z
此消息表示有问题 对于比较器中的传递逻辑,如果
A>B
,则
B
也必须为真。编译器足够聪明,可以向用户指出它。
代码中的问题是,不同的值相互比较。要更正它,您必须比较相同的值
minY
,并且不要使用
=
运算符

这应该起作用:

public int compareTo(IsoSprite o) {
  if (isoDepth > o.isoDepth) return 1;
  if (isoDepth < o.isoDepth) return -1;
  return 0;
}
public int compareTo(IsoSprite o){
如果(isoDepth>o.isoDepth)返回1;
if(isoDepth

请参阅以计算可用于排序/比较IsoSprite的isoDepth。

此消息表示有问题 对于比较器中的传递逻辑,如果
A>B
,则
B
也必须为真。编译器足够聪明,可以向用户指出它。
代码中的问题是,不同的值相互比较。要更正它,您必须比较相同的值
minY
,并且不要使用
=
运算符

这应该起作用:

public int compareTo(IsoSprite o) {
  if (isoDepth > o.isoDepth) return 1;
  if (isoDepth < o.isoDepth) return -1;
  return 0;
}
public int compareTo(IsoSprite o){
如果(isoDepth>o.isoDepth)返回1;
if(isoDepth

请参阅以计算可用于排序/比较ISOSprite的isoDepth。

我意识到我无法在可比较的环境中进行所需的比较。因此,我使用自己的Quicksort实现,使用自己的compareTo方法进行排序,该方法基本上检查一个精灵是在另一个精灵后面还是前面


无论如何,谢谢你的帮助

我意识到我无法在可比的环境中进行所需的比较。因此,我使用自己的Quicksort实现,使用自己的compareTo方法进行排序,该方法基本上检查一个精灵是在另一个精灵后面还是前面



无论如何,谢谢你的帮助

但问题是,我也需要得到那些单独的if语句的边界,我会尝试编辑它,这样它会更清晰,嗯,我一定是误解了你的问题,那么,如果
maxX>o.maxX
但是
minX
@MaxZoom不同的方法,那么等距排序应该如何进行呢?您的问题更多的是,您的比较方法如何违反了
Compariable
接口定义的契约,还是更一般的“我应该如何创建等距元素的自然顺序?”问题?但问题是我也需要得到这些单独的if语句的边界,我会尝试编辑它,这样它会更清晰。嗯,我一定是误解了你的问题,那么,如果
maxX>o.maxX
但是
minX
@MaxZoom不同的方法,那么等距排序应该如何进行呢?您的问题更多的是,您的比较方法如何违反了
Compariable
接口定义的契约,还是更一般的“我应该如何创建等距元素的自然顺序?”问题?但问题是我也需要得到这些单独的if语句的边界,我会尝试编辑它,这样它会更清晰。嗯,我一定是误解了你的问题,那么,如果
maxX>o.maxX
但是
minX
@MaxZoom不同的方法,那么等距排序应该如何进行呢?您的问题更多的是,您的比较方法如何违反了
Compariable
接口定义的契约,还是更一般的“我应该如何创建等距元素的自然顺序?”问题?是的,当在前面添加Math.signum并将其转换为int时。问题似乎是比较不同的变量(参见我的最新编辑)这是个坏主意。如果
z==-2
o.z==Integer.MAX_值
,该怎么办?然后得到一个整数溢出,结果不正确。如果您只想比较两个整数值,请使用
Integer.compare(z,o.z)
。是的,在将Math.signum infront和casting添加到int时效果很好。问题似乎是比较不同的变量(请参阅我的最新编辑)这是个坏主意。如果
z==-2
o.z==Integer.MAX_值
,该怎么办?然后得到一个整数溢出,结果不正确。如果您只想比较两个整数值,请使用
Integer.compare(z,o.z)
。是的,在将Math.signum infront和casting添加到int时效果很好。问题似乎是比较不同的变量(请参阅我的最新编辑)这是个坏主意。如果
z==-2
o.z==Integer.MA怎么办