2013-03-09 56 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位置將它們放在列表中! ?!?這是我的一個非常愚蠢的錯誤