だから私はしばらくの間問題に苦しんでいて、ここで助けを求めたほうがいいと思いました。
TreeSetにTicketオブジェクトを追加しています。TicketはComparableを実装し、equals()、hashCode()、およびCompareTo()メソッドをオーバーライドしています。contains()を使用して、オブジェクトがすでにTreeSetにあるかどうかを確認する必要があります。セットに2つの要素を追加すると、すべて正常にチェックアウトされますが、3つ目の要素を追加すると、混乱します。
TreeSetに3番目の要素を追加した後、この小さなコードを実行すると、Ticket temp2がチェックしているオブジェクト(verkoopLijst)になります。
Ticket temp2 = new Ticket(boeking, TicketType.STANDAARD, 1,1);
System.out.println(verkoop.getVerkoopLijst().first().hashCode());
System.out.println(temp2.hashCode());
System.out.println(verkoop.getVerkoopLijst().first().equals(temp2));
System.out.println(verkoop.getVerkoopLijst().first().compareTo(temp2));
System.out.println(verkoop.getVerkoopLijst().contains(temp2));
これを返します:
22106622
22106622
true
0
false
今私の質問は、これがどのように可能であるかということです。
編集:
public class Ticket implements Comparable{
private int rijNr, stoelNr;
private TicketType ticketType;
private Boeking boeking;
public Ticket(Boeking boeking, TicketType ticketType, int rijNr, int stoelNr){
//setters
}
@Override
public int hashCode(){
return boeking.getBoekingDatum().hashCode();
}
@Override
@SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
public boolean equals(Object o){
Ticket t = (Ticket) o;
if(this.boeking.equals(t.getBoeking())
&&
this.rijNr == t.getRijNr() && this.stoelNr == t.getStoelNr()
&&
this.ticketType.equals(t.getTicketType()))
{
return true;
}
else return false;
}
/*I adjusted compareTo this way because I need to make sure there are no duplicate Tickets in my treeset. Treeset seems to call CompareTo() to check for equality before adding an object to the set, instead of equals().
*/
@Override
public int compareTo(Object o) {
int output = 0;
if (boeking.compareTo(((Ticket) o).getBoeking())==0)
{
if(this.equals(o))
{
return output;
}
else return 1;
}
else output = boeking.compareTo(((Ticket) o).getBoeking());
return output;
}
//Getters & Setters