Java 等距排序的比较错误
因此,我正在为我的精灵实现一个等距分类器,我在比较何时应该渲染瓷砖时遇到了一些问题。我正在对所有等轴测精灵进行排序,这些精灵将通过将它们实现为可比较来进行渲染 问题是,当我实现以下compareTo方法时: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 &&
// 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怎么办