-3

このメソッドを 1 行で記述できるかどうかを知りたいです。y 座標を比較し、x 座標を使用して同点を解消する必要があります。

 // comparing y-coordinates and breaking ties by x-coordinates
    public int compareTo(Point p) {

        if (y < p.y) {
          return -1;
        }
        if (y > p.y) {
           return 1;
        }
        if (x < p.x) {
          return -1;
        }
        if (x > p.x) {
         return 1;
        }
       return 0;
    }

「注。この質問は、すぐに使用できる独自の解決策があるかどうかを確認するために興味を持って尋ねられます。提示された解決策が優れていることは明らかです。」

4

2 に答える 2

3

これは機能するはずです(ただし、読みやすさのためにお勧めしません):

return y < p.y ? -1 : y > p.y ? 1 : x < p.x ? -1 : x > p.x ? 1 : 0;

私はわざわざチェックしていませんが、コンパイラーは元のコードとまったく同じバイトコードを生成すると思います。

于 2012-11-11T22:18:41.907 に答える
2

戻り値の大きさは気にせず、その符号のみを気にすると仮定すると、次のようにすることができます。

return y == p.y ? x - p.x : y - p.y;

編集: Ted Hopp が指摘しているように、このアプローチは、減算がオーバーフローしない限り機能します。xとが常に正であることがわかっている場合y、またはそれらの差が常に 未満であることがわかっている場合Integer.MAX_VALUEは、このバージョンを使用できます。

すべての入力で機能する別の方法を次に示します。

return y == p.y ? ((Integer) x).compareTo(p.x) : ((Integer) y).compareTo(p.y);

Java 1.7を使用している場合は、より単純なものを使用できます

return y == p.y ? Integer.compare(x, p.x) : Integer.compare(y, p.y);
于 2012-11-11T22:19:09.330 に答える