我的 equals 方法有什么问题?
What is wrong with my equals method?
我正在写复数 class,但我的 equals 方法似乎不起作用。我应该检查两个 ComplexNum 对象是否彼此相等,但我总是遇到一个总是 returns false.
的逻辑错误
public boolean equals(Object x) {
ComplexNum real = (ComplexNum) x;
if (x == null)
return false;
if (x instanceof ComplexNum && this.imag == (real.real)) {
return true;
} else
return false;
}
这是我的演示 class
ComplexNum y = new ComplexNum(3.0,15.0);
ComplexNum z = new ComplexNum(3.0,15.0);
System.out.println(y.equals(z));
false < -- 无论值是什么,我的输出都是假的
您没有对复数的实部和虚部进行同类比较。
这将是我的实现:
public boolean equals(Object o) {
if (o instanceof ComplexNum) {
ComplexNum other = (ComplexNum)o;
return (this.real == other.real) && (this.imag == other.imag);
} else {
return false;
}
}
对于那些争论浮点比较永远不应该使用精确测试的人,恕我直言,应该使用另一种方法。 Java 要求 .equal()
的对象具有相同的 .hashCode()
,这将 非常 很难用 epsilon 比较来安排。
由于以上原因,你也需要这个(其他实现也是可能的,下面假设你的组件是double
)
int hashCode() {
return Double(this.real).hashCode() ^ Double(this.imag).hashCode();
}
注意:在 .equals()
中不需要测试 o == null
,因为 null
是 而不是 和 instanceof ComplexNum
。
EDIT 完全严格 符合 .equals()
在 Float
或 [=22 上的工作方式=] 类型(特别是对于 NaN 值),您可能想使用此行,它用 .equals()
的每个组件应用程序替换 ==
return Double(this.real).equals(other.real) &&
Double(this.imag).equals(other.imag);
我正在写复数 class,但我的 equals 方法似乎不起作用。我应该检查两个 ComplexNum 对象是否彼此相等,但我总是遇到一个总是 returns false.
的逻辑错误public boolean equals(Object x) {
ComplexNum real = (ComplexNum) x;
if (x == null)
return false;
if (x instanceof ComplexNum && this.imag == (real.real)) {
return true;
} else
return false;
}
这是我的演示 class
ComplexNum y = new ComplexNum(3.0,15.0);
ComplexNum z = new ComplexNum(3.0,15.0);
System.out.println(y.equals(z));
false < -- 无论值是什么,我的输出都是假的
您没有对复数的实部和虚部进行同类比较。
这将是我的实现:
public boolean equals(Object o) {
if (o instanceof ComplexNum) {
ComplexNum other = (ComplexNum)o;
return (this.real == other.real) && (this.imag == other.imag);
} else {
return false;
}
}
对于那些争论浮点比较永远不应该使用精确测试的人,恕我直言,应该使用另一种方法。 Java 要求 .equal()
的对象具有相同的 .hashCode()
,这将 非常 很难用 epsilon 比较来安排。
由于以上原因,你也需要这个(其他实现也是可能的,下面假设你的组件是double
)
int hashCode() {
return Double(this.real).hashCode() ^ Double(this.imag).hashCode();
}
注意:在 .equals()
中不需要测试 o == null
,因为 null
是 而不是 和 instanceof ComplexNum
。
EDIT 完全严格 符合 .equals()
在 Float
或 [=22 上的工作方式=] 类型(特别是对于 NaN 值),您可能想使用此行,它用 .equals()
==
return Double(this.real).equals(other.real) &&
Double(this.imag).equals(other.imag);