私は、特定の手の有効性や価値を判断することだけが重要なテスト割り当てポーカーゲームのクラスをテストしようとしています。TreeSetが個別のデータを正しく追加しない
私のPokerHand
オブジェクトには、TreeSet<Card>
が含まれています。ダブルスは許されていないので理想的なデータ構造だと思っていました。赤黒のツリーアルゴリズムで自動的にソートします。
しかし、問題は、私がまだ認識していない副作用があるように見えることです。私はダブルスがTreeSet
に追加されないことを理解していますが、私のテストではそうしないようにしています。その代わりに、number
フィールドが等しいがタイプでなくなるとすぐに、新しいCard
オブジェクトがツリーセットに追加されないことに気づいた。
これは
@Test
public void testOnePair() {
hand.addCard(new Card(3, Card.CARD_TYPE.SPADES));
hand.addCard(new Card(8, Card.CARD_TYPE.CLUBS));
hand.addCard(new Card(10, Card.CARD_TYPE.HEARTS));
hand.addCard(new Card(14, Card.CARD_TYPE.SPADES));
hand.addCard(new Card(14, Card.CARD_TYPE.CLUBS));
assertEquals("One Pair", this.hand.getValue());
}
何が起こっているように見えるが、最後Card
があるということです...これは、さまざまなカードを追加し、テストでCard
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Card other = (Card) obj;
return this.type == other.type && this.number == other.number;
}
ためのequalsメソッドであります追加されないので、TreeSet
のサイズは、カードがはっきりとは異なっていても、実質的には4
のままです。 equalsメソッドを参照することさえありません。
ただし、compareTo
の方法になります。
@Override
public int compareTo(Object t) {
if (t.getClass().equals(this.getClass())) {
Card otherCard = (Card)t;
if (otherCard.equals(this)) {
return 0;
}
return this.number - otherCard.number;
}
else {
throw new ClassCastException("Cannot convert " + t.getClass().toString() + " to Card");
}
}
私はJava 8に戻ってからしばらくしていますが、多分何かを明確に監視しています。誰かが私にこれを手伝ってくれることを願っています。
申し訳ありませんが、RTFMです。 "_'TreeSet'インスタンスは、' compareTo(または比較) 'method_"を使ってすべての要素の比較を実行します。あなたの 'compareTo'メソッドは' equals() 'と一貫性がありません。 –