1

我有一个自定义的 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; 
}

如果对象相同,我已经检查了打印我的对象,并且它们确实是相同的。

1.0 1 2.0 0
1.0 1 2.0 0 

我从一个不同的文件中调用我的自定义等于,称为测试。

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.)"); 

还有我的多项式类,它是一个数组列表,里面有 Pair 对象。

class Polynominal implements PolynominalInterface {


ArrayList<Pair> terms = new ArrayList<Pair>(); 

我在互联网上查看,发现我不能在我的 Equals 方法中使用 ==,但我使用的是 Intergers 和 Doubles,所以 equals() 不起作用。

谁能指出我正确的方向?

4

5 回答 5

3

如果orig并且pol1Polynomialthen this的实例

if (orig.equals(pol1))

仅当您也实施时才有效Polynomial#equals();这将迭代两个ArrayLists 并确保各个Pairs 相等(Pair#equals()当然使用)。

于 2013-10-13T16:27:02.740 回答
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); 
}
于 2013-10-13T16:36:26.297 回答
0

使用Double.compare(double, double)方法而不是 ==。

浮点比较在 Java 中是“模糊的”。

于 2013-10-13T16:29:44.317 回答
0

您需要实现一个 Polynomail.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;
}
于 2013-10-13T16:37:28.953 回答
0

想到两个问题:第一个是默认hashCode()方法很少会为任何两个不同的对象实例返回相同的值,无论它们的内容如何。如果该equals()方法永远不会报告两个不同的对象实例相等,这是一件好事,但如果它会是一件坏事。 覆盖的每个对象也Object.equals()应该覆盖Object.hashCode(),以便 if x.equals(y), then x.hashCode()==y.hashCode(); 这很重要,因为即使是非散列的通用集合也可能使用对象的散列码来加速比较。 如果您不想编写“真正的”哈希函数,只需选择一些任意整数并让您的类型的hashCode()方法始终返回该值. 存储您的类型的任何散列集合都将执行缓慢,但存储它的所有集合都应该正确运行。

您可能会看到的第二个问题是浮点比较有时是不可靠的。两个数字可能本质上相等,但比较不相等。更糟糕的是,无论出于何种原因,IEEE 决定浮点“非数字”值应该不等于所有内容——甚至它们自己

考虑到这两个问题,我建议您可能想要重写您的方法equals以链接到. 此外,如果您的对象的任何字段在存储在集合中时都不会被修改,请让您的方法计算 的,将其乘以某个大的奇数,然后将其与 的 相加或异或。如果您的对象在存储在集合中时可能会被修改,请返回一个常量。如果您不覆盖,则不能期望包含您的任何对象的方法都能正常工作。equalsdoublehashCode()hashCodeinthashCodedoublehashCode()hashCode()equals

于 2013-10-13T16:47:58.413 回答