この質問は確かに新しいものではありませんが、役立つ答えはどこにも見つかりませんでした。
以下のコードでわかるように、equals メソッドと hashcode メソッドはオーバーライドされますが、それでも重複は許可されます。ハッシュコードは、Netbeans によって自動的に生成されています。
@Override
public boolean equals(Object o)
{
TaskDetails other = (TaskDetails) o;
if ( (id_subtask == other.id_subtask)
&& ((date.compareTo(other.date)) == 0) )
{
System.err.println("Duplicate Entry"+id_subtask+" + "+other.id_subtask);
return true;
}
else
{
System.out.println("Good!" +id_subtask+" + "+other.id_subtask);
return false;
}
}
@Override
public int hashCode() {
int hash = 7;
hash = 71 * hash + this.id_subtask;
hash = 71 * hash + this.id_team_member;
hash = 71 * hash + Float.floatToIntBits(this.nb_hours);
hash = 71 * hash + (this.date != null ? this.date.hashCode() : 0);
hash = 71 * hash + (this.comment != null ? this.comment.hashCode() : 0);
hash = 71 * hash + (this.subtask_name != null ? this.subtask_name.hashCode() : 0);
System.out.println("Hash : "+hash + "Subtask : " + id_subtask);
return hash;
}
これは、ハッシュセットにエントリを追加するために使用されるコードです。
TaskDetails newTaskDetails = new TaskDetails
(
s.getId_subtask(),
mus.teamMember.getId_team_member(),
f,
mysqlFormat.format(caldate),
c.substring(0, Math.min(c.length(), 100)),
s.getName_subtask()
);
allTasks.add(newTaskDetails);
(allTasks はハッシュセットです)
このコードは関数 A と B で使用されます。
関数 A のみを実行すると、正常に動作します。関数 A の後に関数 B が実行されると (したがって、上記のコードは 2 回実行されます)、重複するエントリがあることを示す system.err がトリガーされても、ハッシュセットは突然重複を受け入れますか?
コードに欠陥がありますか、それとも何か不足していますか?
助けてくれてありがとう!