【问题标题】:How do I define an equals function for a custom complex numbers class in Java?如何在 Java 中为自定义复数类定义 equals 函数?
【发布时间】:2021-10-12 11:14:18
【问题描述】:

这是我的复数类中的一段代码:

public class complex {
    private double re;
    private double im;

    public complex(double real, double imag) {
        re = real;
        im = imag;
    }

    public Boolean equals(complex b) {
        complex a = this;
        return a.re==b.re && a.im==b.im;
    }

    public Boolean equals(double alpha){
        complex a = this;
        return a.re==alpha && a.im==0;
    }
    ...
}

这就是我尝试使用它的目的:

public class cubic_cardano {
    public static void solveCubic(complex a, complex b, complex c, complex d){
        if (a==b && b==c && c==d && d==0) {
            ...
        }
    }
    ...
}

将复数与复数进行比较可以正常工作,而将复数与双精度数进行比较会出错:

Incompatible operand types complex and int

可能是什么原因,我怎样才能使它起作用?

【问题讨论】:

  • 您需要使用.equals(…) 与您的equals 函数进行比较。另请注意,被覆盖的.equals 的方法签名应该不同。这是一个带有Object 参数和原始boolean 返回的方法。
  • 您的 equals 方法毫无意义。你需要重写equals方法,而不是重载它
  • 比较对象时你不能使用 == 你需要使用 .equals 所以 a.equals(b) 等等但是需要注意你调用 equals 的实例不是空。
  • 您好,如果您使用的是最新版本的 Java,您是否考虑过简单地使用 record Complex(double re, double im) {}

标签: java class equals


【解决方案1】:

您需要定义签名,以便正确地重载 Object 方法 equals 和 hashCode。此外,您的类名“complex”应大写为“Complex”。

您的实现仅为“复杂”类型的参数定义了 equals,但它需要接受 Object 参数。这有点令人困惑,但是 Java 的定义方式你需要这样做。

以与您的 equals 方法兼容的方式覆盖 hashCode 方法也非常重要。否则,依赖于 equals 的东西,如 Map,将无法正常工作。

@Override
public boolean equals (Object c)
{
    if (c != null)
    {
        if (c instanceof complex)
        {
            final complex cc = (complex)c;
            return cc.re == re && cc.im == im;
        }
    }
    return false;
}

@Override
public int hashCode ()
{
    return Double.hashCode (re) + Double.hashCode(im);
}

【讨论】:

  • 在这种情况下您可以省略if (c != null ) ...,因为如果传递了 null,instanceof 将返回 false。
  • 感谢提醒
【解决方案2】:

您不能使用equals== 来比较两个具有不相关类型的对象。相反,您应该与值为 0 的 Complex 进行比较:

    public static void solveCubic(Complex a, Complex b, Complex c, Complex d){
        if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(new Complex(0, 0))) {
            //...
        }
    }

附言正如其他人在 cmets 中指出的那样,您的 Complex 类还有其他几个问题。这是我正在使用的版本:

import java.util.Objects;

public class Complex {
    private double re;
    private double im;

    public Complex(double real, double imag) {
        re = real;
        im = imag;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Complex other = (Complex) o;
        return re == other.re && im == other.im;
    }

    @Override
    public int hashCode() {
        return Objects.hash(re, im);
    }
}

【讨论】:

  • 如果您可以使用 Java 16 或更高版本,您可以使用record Complex(double re, double im) {}
【解决方案3】:

基本上:不,你不能。 Java 不支持“运算符重载”,这会改变运算符为您自己的类工作的方式。 你只需要选择complexA.equals(complexB);

关于运算符重载Why doesn't Java offer operator overloading?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2017-09-25
    • 2013-07-22
    • 2017-03-31
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多