我有一个自定义等于检查我的对象名为Pair的相等性。
class Pair implements Comparable <Parr> {
double coef;
int power;
Pair(double a, int b) {
coef = a;
power = b;
}
我的自定义equals方法是(位于类对中):
@Override
public boolean equals(Object o) {
if (!(o instanceof Pair))
return false;
Pair that = (Pair) o;
return that.coef == this.coef && that.power == this.power;
}
如果对象是相同的,我已经检查了print对象,它们确实是相同的。
1.0 1 2.0 0
1.0 1 2.0 0
我从另一个名为Test的文件中调用我的自定义等号。
class Test {
public static void main(String[] args) {
orig = pol1.differentiate().integrate();
System.out.print(orig);
if (orig.equals(pol1))
System.out.println(" (is equal.)");
else
System.out.println(" (is not equal.)");
我的类Polynomial,这是一个带有Pair对象的arraylist。
class Polynominal implements PolynominalInterface {
ArrayList<Pair> terms = new ArrayList<Pair>();
我在互联网上查看,我发现我不能在我的Equals方法中使用==,但是我使用的是Intergers和Doubles,所以equals()不起作用。
有人能指出我正确的方向吗?
答案 0 :(得分:3)
如果orig
和pol1
是Polynomial
的实例,那么
if (orig.equals(pol1))
只有在您实施Polynomial#equals()
时才有效;这将迭代两个ArrayList
并确保单个Pair
相等(当然使用Pair#equals()
)。
答案 1 :(得分:2)
好的,感谢Ravi Thapliyal,我找到了解决方案。
在我的Polynominal类中添加自定义equals方法后,问题得到了解决。
@Override
public boolean equals(Object o) {
if (!(o instanceof Polynomial))
return false;
Polynomial that = (Polynomial) o;
return that.terms.equals(terms);
}
答案 2 :(得分:0)
使用Double.compare(double, double)方法代替==。
Java中的浮点比较是“模糊的”。
答案 3 :(得分:0)
您需要实现类似以下的Polynomial.equals()方法:
public boolean equals(Object o) {
if (!(o instanceof Polynomial)) return false;
Polynomial other = (Polynomial) o;
if (this.terms==null && other.terms==null) return true;
// A suitable equals() method already exists for ArrayList, so we can use that
// this will in turn use Pair.equals() which looks OK to me
if (this.terms!=null && other.terms!=null) return this.terms.equals(other.terms);
return false;
}
答案 4 :(得分:0)
首先想到两个问题:第一个问题是默认的hashCode()
方法很少会为任何两个不同的对象实例返回相同的值,无论其内容如何。如果equals()
方法永远不会将两个不同的对象实例报告为相等,那么这是一件好事,但如果它会是坏事。 覆盖Object.equals()
的每个对象也应覆盖Object.hashCode()
,以便x.equals(y)
,x.hashCode()==y.hashCode()
;这很重要,因为即使是非散列的通用集合也可以使用对象的哈希码来加速比较。 如果您不想编写“真实”哈希函数,只需选择一些任意整数,并让您的类型hashCode()
方法始终返回。存储类型的任何散列集合将执行缓慢,但存储它的所有集合应该正常运行。
您可能会看到的第二个问题是浮点比较有时是狡猾的。两个数字可能基本相等,但比较不相等。更糟糕的是,IEEE无论出于何种原因决定浮点“非数字”值应该与所有内容相比不等 - 甚至自己。
将这两个问题放在一起,我建议您可能需要重写equals
方法以链接到equals
double
方法。此外,如果对象的任何一个字段在存储到集合中时都不会被修改,请让hashCode()
方法计算hashCode
的{{1}},将其乘以一些大的奇数,并且然后使用int
的{{1}}添加或xor。如果您的对象在存储在集合中时可能会被修改,请hashCode
返回常量。如果您不覆盖double
,则不能指望包含您的任何对象的hashCode()
方法正常工作。