Java 我的方法有什么问题?
我正在写一个复数类,我的equals方法似乎不起作用。我应该检查两个ComplexNum对象是否彼此相等,并且我总是遇到一个总是返回false的逻辑错误Java 我的方法有什么问题?,java,equals,complex-numbers,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 == (rea
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<--无论值是什么,我的输出都是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()
,这将很难用ε比较来排列
由于上述原因,您也将需要此功能(其他实现也是可能的,下面假设您的组件是double
)
注意:在.equals()
中不需要对o==null
进行测试,因为null
不是ComplexNum的实例
编辑要完全符合.equals()
在Float
或Double
类型(尤其是NaN值)上的工作方式,您可能需要使用此行,它将=
替换为每个组件应用程序的.equals()
查找浮点相等性测试。这是您的问题,因为浮点数的数字表示永远都不精确(除非在某些不常见的情况下),因此不应使用==
来测试这些实体的相等性。您正在比较这部分的虚部和另一部分的实部。另外,不要将另一个命名为“real”,这非常令人困惑。我认为你不应该将一个值的real
与另一个值的imag
进行比较,是吗?嗯,这不是讨论ε比较是否更合适的地方。IMHO(再次)使用.equals()
方法应该完全执行=
对浮点所做的操作,并且应该在另一个方法中执行基于epsilon的比较。注意:如果传递的对象不是ComplexNum
,则此原始代码将导致类castexception
,因为您在第一行执行强制转换,不首先使用instanceof
检查类型。
int hashCode() {
return Double(this.real).hashCode() ^ Double(this.imag).hashCode();
}
return Double(this.real).equals(other.real) &&
Double(this.imag).equals(other.imag);