2016-03-20 60 views
4

我正在寫一個等距遊戲,它根據Y座標呈現對象,使用可比類,按其Y值排序,進行哪些更改。我收到錯誤「比較方法違反其總合同!」並閱讀有關如何返回一個負數,0或正數,所以我已經實現了這一點:Java可比較類 - 比較方法違反其總體合同

public boolean equals(Entity e) { 
    if ((e.y-y)==0) 
     return (e.id == id); 
    return (e.y == y); 
} 

public int compareTo(Entity e) { 
    if ((e.y-y)==0) 
     return (e.id - id); 
    return (int) (e.y - y); // Render order by y coordinate 
} 

但我仍然得到錯誤。排序不會工作,如果價值觀的變化,或者我做了其他錯誤?

+0

你的'y'字段是什麼類型? –

+0

y是浮點類型 –

+0

關於該異常消息已有很多問題。發帖前搜索。證明你的問題不是上述問題之一的重複。 – Raedwald

回答

7

equals方法沒有涉及合同,所以我們可以忽略它。

我懷疑問題是由整數溢出引起的。問題是x - y並不總是給你一個肯定的答案,如果x > y和一個負數如果x < y。如果數字之間的差異足夠大,則快遞x - y將溢出,結果將顯示錯誤的符號。

如果是這樣的問題,那麼簡單的解決方案是使用Integer.compare(x, y)代替x - y

另一種可能性是,實體是在爲你(例如)在同一時間對它們進行排序正在發生突變。


Float.compare(X,Y)努力好得多。

我會假設xyint。如果他們是float那麼問題的真正原因很難理解。無論哪種方式,使用Float.compare(x, y)是一個更好的解決方案。

但如果xy實際上int,然後使用Float.compare(x, y)會給你不正確解答一些xy值。對於具有足夠大的值的xy的接近值,intfloat的轉換將失去精度,並且Float.compare將會說它們是相等的。

+0

你是完全正確的。我不知道爲什麼我以前沒有看到。 y值既可以是正數,也可以是負數或者每一個都會給出不同的結果。 Float.compare(x,y)工作得好多了。非常感謝你的幫助! –

相關問題