3

次の単純な Rectangle クラスがあります。2 つの長方形の高さと幅が同じ場合、それらは等しく、同じハッシュコードを持ちます。hashSet に新しい四角形を追加しました。

Set<Rectangle> set = new HashSet<Rectangle>();
set.add(new Rectangle(3,3));

高さと幅が同じ新しい長方形で contains を呼び出そうとすると、false が返されます。

set.contains(new Rectangle(3,3))false を返します。理由がわかりません。何か案は?

   public class Rectangle implements Comparable<Rectangle> {
            final int height, width, area, minimumEdge, maximumEdge;

            public Rectangle(int height, int width) {
                this.height = height;
                this.width = width;
                area = height * width;
                maximumEdge = height > width ? height : width;
                minimumEdge = height < width ? height : width;
            }

            public int compareTo(Rectangle rect2) {
                if (rect2.minimumEdge > this.minimumEdge) {
                    return -1;
                } else if (rect2.minimumEdge < this.minimumEdge) {
                    return 1;
                } else {
                    return 0;
                }
            }

            public int hashCode(){
                return ((width + height)*31);
            }

            public boolean equals(Rectangle rect2){
                return (this.height == rect2.height && this.width == rect2.width);
            }
        }
4

2 に答える 2

14

実際にはオーバーライドしていませんequals()

equals(Rectangle)仮想メソッドとは関係のない新しいメソッドを作成しましたequals(Object)

@Overrideこれが、メソッドをオーバーライドしようとするときに常に追加する必要がある理由です。

于 2013-09-01T03:50:49.123 に答える
3

ここ:

public boolean equals(Rectangle rect2){
            return (this.height == rect2.height && this.width == rect2.width);
        }

スーパークラス メソッドをオーバーライドするのではなく、独自の equals メソッドを作成します。

次のように書く必要があります。

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Rectangle rect2 = (Rectangle) obj;
    return (this.height == rect2.height && this.width == rect2.width);
}
于 2013-09-01T04:03:58.020 に答える