我的equals方法有什么问题?

时间:2017-10-04 21:49:06

标签: java equals complex-numbers

我正在编写一个复数类,我的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< - 无论值是什么,我的输出都是假的

1 个答案:

答案 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()FloatDouble类型的处理方式(特别是对于NaN值) )您可能希望使用此行替换==替换.equals()

的每个组件应用程序
return Double(this.real).equals(other.real) &&
       Double(this.imag).equals(other.imag);