为什么我的自定义等于方法(双精度和整数)不起作用?

时间:2013-10-13 16:21:09

标签: java equals

我有一个自定义等于检查我的对象名为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()不起作用。

有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:3)

如果origpol1Polynomial的实例,那么

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()方法正常工作。