2017-04-01 11 views
1

私の要素のハッシュセットを作成するとき、何らかの理由で重複する要素を追加することができます。私はequalsメソッドとhashcodeメソッドをオーバーライドしました。下には私のコードのビットと私の問題の例があります。簡単にするために、私は自分の要素を「要素」と名付けました。私のハッシュセットに重複が含まれているのはなぜですか?

set.add(new element(new Point2D.Double(0,1), new Point2D.Double(2, 3), true)); 
set.add(new element(new Point2D.Double(0,1), new Point2D.Double(2, 3), true)); 
for (element e : set) 
    System.out.println("set element : " + e.firstPoint2D.toString() 
            + e.secondPoint2D.toString() 
            + e.lastBoolean 
            + " and hashcode = " + e.hashCode()); 

これが返されます。

set element : Point2D.Double[0.0, 1.0] Point2D.Double[2.0, 3.0] true 
and hashcode = 3211 
set element : Point2D.Double[0.0, 1.0] Point2D.Double[2.0, 3.0] true 
and hashcode = 3211 

は、我々は明らかに、彼らが同じハッシュコードを持って見、なぜ彼らはHashSetの中で両方ですか?私はハッシュセットのユーティリティが重複を含むことができないという事実にあると思ったのですか?何か不足していますか?ここでイコールとハッシュコード:

public boolean equals(element e) { 
    if (this.firstPoint2D.equals(e.firstPoint2D) && 
    this.secondPoint2D.equals(e.secondPoint2D) && 
    this.lastBoolean == e.lastBoolean) 
     return true; 
    else 
     return false; 
} 

@Override 
public int hashCode() { 
    int result = (int)(firstPoint2D.getX() + 10*firstPoint2D.getY() 
    + 100*secondPoint2D.getX() + 1000*secondPoint2D.getY()); 
    if (lastBoolean) 
     return result + 1; 
    else 
     return result; 
} 
+1

'Point2D.Double'に' equals'メソッドを投稿できますか?あなたは問題がある可能性があります - 'Point2D.hashCode'では' Point2D.Double'の 'hashCode'を手動で生成しますが、' Point2D.equals'では 'Point2D.Double.equals'に依存しています - これは間違っている可能性があります。 –

+2

'@ Override'をequalsメソッドに追加してみてください。常に。 – Pshemo

+0

@BoristheSpider OPが 'java.awt.geom.Point2D.Double'を使用していると思われます。 – Pshemo

答えて

1

あなたequals方法が正しくオーバーライドされていない、したがって、それはObjectクラスではなく、オーバーライドされたバージョンのeqauls()方法を使用しています。 equals()ため

@Override 
public boolean equals(Object e) { 
    if (e instanceof element && 
    this.firstPoint2D.equals(((element)e).firstPoint2D) && 
    this.secondPoint2D.equals(((element)e).secondPoint2D) && 
    this.lastBoolean == ((element)e).lastBoolean) 
     return true; 
    else 
     return false; 
} 

HereのJavadocを:あなたはオーバーライドされている1が動作するはずです以下、elementを受け入れるのに対し、OB Objectクラスequals()方法はObject引数を受け入れます。

+0

これ以上の複製はありません!ありがとう –

関連する問題