等距排序的比较错误

时间:2015-06-09 14:52:25

标签: 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 && 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;
}

我收到错误“比较方法违反了其总合同!”来自LibGDX数组中的array.sort调用(我用它进行排序)。我不知道在看这个错误的其他人的问题时我应该如何解决这个问题,但这些问题大多是微不足道的。任何人都知道我应该如何在等长比较中解决这个问题?

我的等距世界(供参考): enter image description here

编辑: 只按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;
}

2 个答案:

答案 0 :(得分:0)

此消息表明出现了问题 在比较器中使用传递逻辑,对于if A > B,则B < A也必须为真。编译器足够智能,可以向用户指出 代码中的问题是将不同的值相互比较。要更正它,您必须比较相同的值minY < o.minY,而不是使用<=>=运算符。

这应该有效:

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

请参阅algorithm以计算可用于对IsoSprites进行排序/比较的isoDepth。

答案 1 :(得分:0)

我意识到我无法进行比较所需的比较。因此,我使用自己的Quicksort实现来使用我自己的compareTo方法进行排序,该方法基本上检查精灵是否落后于另一个精灵。

感谢所有的帮助!