代码之家  ›  专栏  ›  技术社区  ›  user8589267

我的equals方法有什么问题?

  •  -1
  • user8589267  · 技术社区  · 8 年前

    我正在写一个复数类,我的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));
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alnitak    8 年前

    你没有对复数的实部和虚部进行相似比较。

    这将是我的实现:

    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();
    }
    

    NB:测试 o == null 在中没有必要 .equals() null instanceof ComplexNum .

    编辑 对于 符合以下方式: .等于() 工作于 Float Double 类型(尤其是NaN值),您可能希望使用此行代替 == 每个组件应用 .等于()

    return Double(this.real).equals(other.real) &&
           Double(this.imag).equals(other.imag);