2016-03-20 18 views
4

私はオブジェクトをY座標に基づいてレンダリングする等価ゲームを作成しています。同等のクラスを使用してY値で並べ替えます。 「比較方法は一般契約に違反しています」というエラーが表示されます。負の数、0、または正の数を返す方法を読んだので、これを実装しました:Java Comparable Class - 比較メソッドが一般契約に違反しています

私はまだエラーが発生しています。値が変更されたり、何か他のことが間違っている場合、ソートは機能しませんか?

+0

「y」フィールドはどのタイプですか? –

+0

yはfloat型です –

+0

その例外メッセージに関する質問は既に多数あります。投稿する前に検索してください。質問が前の質問と重複していないことを実証する。 – Raedwald

答えて

7

equalsメソッドは契約に含まれていないため、無視することができます。

問題は整数のオーバーフローが原因であると思われます。問題は、x > yの場合にはx - yが常に肯定的な答えを返すとは限らず、x < yの場合は負の数値を返すということです。数字の差が十分大きい場合、x - yという表現はオーバーフローし、結果に間違った符号が付きます。

それが問題である場合には、簡単な解決策ではなくx - y

別の可能性のInteger.compare(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)はもっとうまく機能しました。あなたの助けをありがとう! –