특정 핸드의 유효성 또는 값을 결정하는 것이 중요하기 때문에 테스트 지정 포커 게임을 테스트하려고합니다.TreeSet이 고유 한 데이터를 올바르게 추가하지 않음
내 PokerHand
개체에 TreeSet<Card>
이 포함되어 있습니다. double이 허용되지 않기 때문에 이것이 이상적인 데이터 구조라고 생각했습니다. 그리고 red-black 트리 알고리즘을 사용하여 자동으로 정렬합니다.
그러나 문제는 내가 아직 알지 못하는 몇 가지 부작용이있는 것으로 보입니다. 복식은 TreeSet
에 추가되지 않는다는 것을 이해합니다. 그러나 제 테스트에서 나는 그렇게하지 않도록합니다. 대신 number
필드가 같지만 형식이 아닌 즉시 새 Card
개체를 TreeSet에 추가하지 않는다는 것을 알았습니다.
이
일어나고있는 것으로 보인다 무엇@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
방법에 도달합니다. 나는 자바 (8)에 다시 들어 왔 어쩌면 난 그냥 분명히 뭔가를 감독하고있어 이후
@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");
}
}
그것은 잠시였다. 나는 누군가가 이것으로 나를 도울 수 있기를 바랍니다.
죄송하지만 RTFM. "_'TreeSet' 인스턴스는 'compareTo (또는 비교)'method_"를 사용하여 모든 요소 비교를 수행합니다. 귀하의'compareTo' 메쏘드는 필요에 따라'equals()'와 일치하지 않습니다. –