如何将compareTo方法作为一个线程写入点

时间:2012-11-11 22:15:49

标签: java

我想知道是否可以在一行中编写此方法。我需要使用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;
    }

“注意。问题是有兴趣的,看是否有任何原始的开箱即用的解决方案。很明显,提出了                解决方案很好“

2 个答案:

答案 0 :(得分:3)

这应该有用(但我不推荐它以便于阅读):

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

我没有费心去检查,但我猜测编译器会生成与原始代码完全相同的字节代码。

答案 1 :(得分:2)

假设您不关心返回值的大小,只关注它的符号,您可以这样做:

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

编辑:正如Ted Hopp指出的那样,这种方法只有在减法不溢出时才有效。如果您知道xy始终为正,或者它们之间的差异始终小于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);