私の要素のハッシュセットを作成するとき、何らかの理由で重複する要素を追加することができます。私は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;
}
'Point2D.Double'に' equals'メソッドを投稿できますか?あなたは問題がある可能性があります - 'Point2D.hashCode'では' Point2D.Double'の 'hashCode'を手動で生成しますが、' Point2D.equals'では 'Point2D.Double.equals'に依存しています - これは間違っている可能性があります。 –
'@ Override'をequalsメソッドに追加してみてください。常に。 – Pshemo
@BoristheSpider OPが 'java.awt.geom.Point2D.Double'を使用していると思われます。 – Pshemo