我正在编写一个复数类,我的equals方法似乎不起作用。我应该检查两个ComplexNum对象是否彼此相等,我总是遇到一个总是返回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;
}
这是我的演示类
ComplexNum y = new ComplexNum(3.0,15.0);
ComplexNum z = new ComplexNum(3.0,15.0);
System.out.println(y.equals(z));
false< - 无论值是什么,我的输出都是假的
答案 0 :(得分:1)
您没有对复数的实部和虚部进行类似的比较。
这将是我的实施:
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();
}
注意:o == null
中不需要.equals()
的测试,因为null
不 instanceof ComplexNum
。
编辑,完全严格符合.equals()
对Float
或Double
类型的处理方式(特别是对于NaN值) )您可能希望使用此行替换==
替换.equals()
return Double(this.real).equals(other.real) &&
Double(this.imag).equals(other.imag);