【问题标题】:Comparison error for isometric sorting等距排序的比较错误
【发布时间】:2015-06-09 14:52:25
【问题描述】:

所以我正在为我的精灵实现一个等距排序器,但在比较应该何时渲染图块时遇到了一些问题。我正在对所有将通过将它们实现为可比较来呈现的等距精灵进行排序。

问题是,当我实现以下 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 调用。在查看其他人遇到此错误的问题时,我不知道应该如何解决此问题,但这些问题大多是微不足道的。有人知道我应该如何在等距比较中解决这个问题吗?

我的等距世界(供参考):

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

【问题讨论】:

  • 但问题是我也需要通过这些单独的 if 语句来获得边界,我会尝试对其进行编辑以便更清晰
  • 嗯,那我一定是误会你的问题了。
  • 如果maxX &gt; o.maxXminX &lt; o.minX,等距排序应该如何表现
  • @MaxZoom 方法不一样
  • 您的问题是更多关于您的比较方法如何违反Comparable 接口定义的合同,还是更一般的“我应该如何创建等距元素的自然排序”问题?

标签: java sorting libgdx comparable isometric


【解决方案1】:

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

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    此消息表明有问题 在比较器中使用传递逻辑,因为如果A &gt; B 那么B &lt; A 也必须为真。编译器足够聪明,可以将其指出给用户。
    代码中的问题是不同的值相互比较。要更正它,您必须比较相同的值 minY &lt; o.minY,而不是使用 &lt;=&gt;= 运算符。

    这应该有效:

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

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

    【讨论】:

    • 是的,在添加 Math.signum infront 并转换为 int 时。问题似乎是比较不同的变量(请参阅我的最新编辑)
    • 坏主意。如果 z == -2o.z == Integer.MAX_VALUE 怎么办?然后你得到一个整数溢出而不是正确的结果。如果您只想比较两个整数值,请使用 Integer.compare(z, o.z)
    猜你喜欢
    • 2014-11-21
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多