2013-03-09 397 views
0

我得到这个错误:当我试图在Java中运行这个比较对我的实体系统Java的比较抛出非法参数异常

Exception in thread "Thread-3" java.lang.IllegalArgumentException: Comparison method violates its general contract! 

private Comparator<Entity> spriteSorter = new Comparator<Entity>() { 
    public int compare(Entity e0, Entity e1) { 
     if (e1.position.getX() <= e0.position.getX()) 
      return +1; 
     if (e1.position.getY() >= e0.position.getY()) 
      return -1; 
     return 0; 
    } 
}; 

下面是执行:

private void sortAndRender(Bitmap b, Vec2 offset, ArrayList<Entity> l) { 
    Collections.sort(l, spriteSorter); 
    for (int i = 0; i < l.size(); i++) { 
     l.get(i).render(b, offset); 
    } 
} 

这个问题只在我在屏幕上显示大量实体时才真正开始发生。这里发生了什么?

+1

大于/小于符号不正确,您的比较函数永远不会返回零 – 2013-03-09 17:54:28

+0

您没有实现equals(Object)方法。 – shuangwhywhy 2013-03-09 17:55:06

+0

@shuangwhywhy这与'equals'无关。 – 2013-03-09 17:56:19

回答

1

你的比较器显然是错误的。更好的方式是像

if (e1.position.getX() != e0.position.getX()) 
     return Integer.compare(e1.position.getX(), e0.position.getX()); 
    if (e1.position.getY() != e0.position.getY()) 
     return Integer.compare(e1.position.getY(), e0.position.getY()); 
    return 0; 
+0

您的解决方案没有正确工作,但我确实注意到我做错了什么,所以非常感谢。 – DazKins 2013-03-09 18:00:54

0

虽然@Louis打我给它在大多数情况下,拟订并可能澄清...

你比较方法必须相当“稳定”,完整。你的返回值为0,在X和Y不同的许多情况下,返回“equals”。

当您比较来我把它改写为

int result = Integer.compare(e1.position.getX(), e0.position.getX()); 
if (result == 0) 
    result = Integer.compare(e1.position.getY(), e0.position.getY()); 
... if you have more to compare, add more if (result == 0) blah blah here... 

return result; 

至于“稳定”,让我们说你有两个点,一个= 4,2和b = 2,4

b,你得到0 但是当你比较b到a时,你得到1.

这是比较器中的“非法”。 a.compareTo(b)应该等于-b.compareTo(a)

0

哈哈,问题是我出于某种原因将它们放在基于x位置的列表中,并且根据y位置将它们放在列表中! ?!?这是我的一个非常愚蠢的错误