我正在解决“破解编码面试”一书中的问题...... 我有一个疑问。问题是:
在二维平面上给出两个正方形,找到一条可以切割这两个正方形的直线 方块一半。
解决方案:任何穿过矩形中心的线都必须将其切成两半。因此,如果你画了 连接两个正方形的中心的线,它会切成两半。
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方法中检查它们是否是同一个正方形的点。点不可变吗?请帮助我...... 提前谢谢。
答案 0 :(得分:9)
Point
是不可变的并不重要。重要的是==
正在进行指针/引用比较。正在检查middle_s
和middle_t
是否引用相同的Object实例,而不是它们的内部字段是否相同。
您可能要做的是为equals()
类实现/覆盖Point
,以便它比较x
和y
坐标,如果匹配则返回true 。然后,您可以通过if (middle_s.equals(middle_t))
来比较您的积分。
当您覆盖equals()
时,请务必相应地覆盖hashCode()
。
答案 1 :(得分:2)
Point是不可变的并不重要......真正的问题仍然存在。
重要的是你是否关心点对象的身份 - 无论它们是同一个实例 - 还是你关心点对象的值
在这里,显然你关心点的价值,而不是它是哪个对象实例,所以你应该使用middle_s.equals(middle_t)
。
答案 2 :(得分:0)
从JavaDocs开始,您可以使用equals
方法比较两个Point
对象。
另外:让我们看一下Android developer's page以获得更多解释:
将此实例与指定对象进行比较,并指出它们是否存在 是平等的。为了相等,o必须代表相同的对象 此实例使用特定于类的比较。一般合同 是这种比较应该是反身的,对称的,和 传递。此外,除null之外的任何对象引用都不等于null