私はオブジェクトをY座標に基づいてレンダリングする等価ゲームを作成しています。同等のクラスを使用してY値で並べ替えます。 「比較方法は一般契約に違反しています」というエラーが表示されます。負の数、0、または正の数を返す方法を読んだので、これを実装しました:Java Comparable Class - 比較メソッドが一般契約に違反しています
私はまだエラーが発生しています。値が変更されたり、何か他のことが間違っている場合、ソートは機能しませんか?
私はオブジェクトをY座標に基づいてレンダリングする等価ゲームを作成しています。同等のクラスを使用してY値で並べ替えます。 「比較方法は一般契約に違反しています」というエラーが表示されます。負の数、0、または正の数を返す方法を読んだので、これを実装しました:Java Comparable Class - 比較メソッドが一般契約に違反しています
私はまだエラーが発生しています。値が変更されたり、何か他のことが間違っている場合、ソートは機能しませんか?
equals
メソッドは契約に含まれていないため、無視することができます。
問題は整数のオーバーフローが原因であると思われます。問題は、x > y
の場合にはx - y
が常に肯定的な答えを返すとは限らず、x < y
の場合は負の数値を返すということです。数字の差が十分大きい場合、x - y
という表現はオーバーフローし、結果に間違った符号が付きます。
それが問題である場合には、簡単な解決策ではなくx - y
別の可能性のInteger.compare(x, y)
を使用するのは、あなたが(たとえば)にそれらをソートしていると実体は同じ時間で変異されていることです。
Float.compare(x、y)は、はるかに良好に働きました。
私はx
とy
がint
たと仮定のです。それらがfloat
である場合、問題の真の原因は理解しにくいです。いずれにしても、Float.compare(x, y)
を使用する方が良い解決策です。
しかしx
とy
が実際int
されている場合は、Float.compare(x, y)
を使用すると、あなたにいくつかのx
とy
値に対する間違った答えを与えるだろう。十分な大きさのx
とy
の近い値の場合、int
〜float
の変換精度は失われ、Float.compare
は等しいと言います。
あなたは完全に正しいです。なぜ私はそれが以前に見えなかったのか分かりません。 yの値は、正の値でも、負の値でも、それぞれの値のいずれかであることができます。 Float.compare(x、y)はもっとうまく機能しました。あなたの助けをありがとう! –
「y」フィールドはどのタイプですか? –
yはfloat型です –
その例外メッセージに関する質問は既に多数あります。投稿する前に検索してください。質問が前の質問と重複していないことを実証する。 – Raedwald