3

当我正在解决“破解编码面试”一书中的问题时......我有一个疑问。问题是:

给定二维平面上的两个正方形,找到一条将这两个正方形切成两半的线。

解决方案:任何穿过矩形中心的线都必须将其切成两半。因此,如果你画一条连接两个正方形中心的线,它将把两个正方形切成两半。

   public class Square {
       public double left;
       public double top;
       public double bottom;
       public double right;
       public Square(double left, double top, double size) {
              this.left = left;
              this.top = top;
              this.bottom = top + size;
              this.right = left + size;
       }

       public Point middle() {
              return new Point((this.left + this.right) / 2,
                                           (this.top + this.bottom) / 2);
       }

       public Line cut(Square other) {
              Point middle_s = this.middle();
              Point middle_t = other.middle();
              if (middle_s == middle_t) {
                     return new Line(new Point(left, top),
                     new Point(right, bottom));
              } else {
                     return new Line(middle_s, middle_t);
              }
       }
}

但现在的疑问是 cut 方法中的 '==' 运算符来检查它们是否是同一个正方形的点。点是不可变的吗??请帮助我...在此先感谢。

4

3 回答 3

9

是否不可变无关紧要Point。重要的==是正在进行指针/引用比较。它检查是否middle_smiddle_t引用相同的 Object 实例,而不是它们的内部字段是否相同。

您可能想要做的是实现/覆盖equals()该类Point,以便它比较xy坐标,如果它们匹配则返回 true。然后你可以通过做比较你的观点if (middle_s.equals(middle_t))

当您覆盖时equals(),请确保您也hashCode()相应地覆盖。

于 2011-07-31T00:49:37.173 回答
2

Point 是否不可变并不重要……真正的问题仍然存在。

重要的是你是否关心点对象的身份——它们是否是同一个实例——或者你关心点对象的

在这里,显然您关心的是点的值,而不是它是哪个对象实例,所以您应该使用middle_s.equals(middle_t).

于 2011-07-31T01:06:07.997 回答
0

JavaDocs中,您可以使用equals方法来比较两个Point对象。
另外:让我们看看Android开发者页面以获得更多解释:

将此实例与指定对象进行比较并指示它们是否相等。为了相等,o 必须使用特定于类的比较来表示与此实例相同的对象。一般约定是这种比较应该是自反的、对称的和传递的。此外,除了 null 之外,没有任何对象引用等于 null

于 2014-04-04T16:28:55.737 回答