1

座標クラスと座標のリストがあります。座標クラスの equals メソッドをオーバーライドしましたが、座標のリストで contains を使用すると、リストにある座標に対して false になります。誰かが私がどこで間違っているのか考えていますか? x と y の値は int です。

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 に答える