1

我有一个坐标类和一个坐标列表。我已经覆盖了坐标类的 equals 方法,但是当我在坐标列表中使用 contains 时,对于列表中的坐标,我得到 false。有没有人知道我哪里出错了?x 和 y 值是整数。

public boolean equals(Coordinate c){
        return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
    }

清单如下:

List safe_locs = new ArrayList<Coordinate>();

测试如下:

System.out.println(c);
System.out.println(safe_locs.contains(c));
System.out.println(safe_locs);

输出是:

Coordinate[x: 0, y: 0]
false
[Coordinate[x: 0, y: 0], Coordinate[x: 1, y: 0], Coordinate[x: 0, y: 1], Coordinate[x: 3, y: 0], Coordinate[x: 0, y: 3]]
4

3 回答 3

9

您的equals()方法正在重载 equals(Object),而它应该覆盖它:

@Override
public boolean equals(Object o){
    if(!(o instanceof Coordinate)) {
        return false;
    }
    Coordinate c = (Coordinate)o;
    return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
    }

不幸的是,您必须使用向下转换。注意@Override注释 - 将来使用它来避免此类问题。

于 2012-10-07T12:47:50.947 回答
2

我知道很多读者会发现这种equals实现风格过于简洁,但equals它是一种非常标准的全样板方法,一旦你实现了几百个,你就会越来越喜欢这种风格:

@Override
public boolean equals(Object o) {
   Coordinate that;
   return this == o || o instanceof Coordinate 
     && this.x == (that = (Coordinate)o).getxCoordinate() 
     && this.y == that.getyCoordinate();
}

关键是,无论您始终使用哪种实现风格,您很快就会停止查看详细的程序逻辑,而只会注意到显着特征:哪些字段参与以及它们通过什么方式进行比较。一旦达到这一点,这种实现的简洁性就会大放异彩。如果您再次怀疑存在错误,请再次减少代码,减少检查它的工作量。

于 2012-10-07T12:54:16.180 回答
0

我认为你已经重载equals()方法而不是覆盖它..

public boolean equals(Object o){

    if(!(o instanceof Coordinate)) {

        return false;
    }
    else{
    Coordinate c = (Coordinate)o;
    return (this.x == c.getxCoordinate() && this.y == c.getyCoordinate());
    }

    }
于 2012-10-07T12:52:02.660 回答