-3

我想知道是否可以在一行中编写此方法。我需要使用 x 坐标比较 y 坐标并打破平局。

 // 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 回答