2017-01-15 9 views
0

私は、特定の手の有効性や価値を判断することだけが重要なテスト割り当てポーカーゲームのクラスをテストしようとしています。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に戻ってからしばらくしていますが、多分何かを明確に監視しています。誰かが私にこれを手伝ってくれることを願っています。

+1

申し訳ありませんが、RTFMです。 "_'TreeSet'インスタンスは、' compareTo(または比較) 'method_"を使ってすべての要素の比較を実行します。あなたの 'compareTo'メソッドは' equals() 'と一貫性がありません。 –

答えて

0

私はいつもここで質問をすることを嫌ってきました。私がそれを提出するとすぐにこれを解決した...これをあなたと共有したい。 TreeSetは、compareToメソッドについてのみ気にします。だから私はそれを次のように変更しました。

@Override 
public int compareTo(Object t) { 
    if (t.getClass().equals(this.getClass())) { 
     Card otherCard = (Card)t; 

     if (this.number == otherCard.number) return this.type.compareTo(otherCard.type); 

     return this.number - otherCard.number; 
    } 
    else { 
     throw new ClassCastException("Cannot convert " + t.getClass().toString() + " to Card"); 
    } 
} 

今同等の契約はタイププロパティの「意識」であるので、これは、それを解決しました。

関連する問題