2017-01-15 7 views
0

특정 핸드의 유효성 또는 값을 결정하는 것이 중요하기 때문에 테스트 지정 포커 게임을 테스트하려고합니다.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"); 
    } 
} 

그것은 잠시였다. 나는 누군가가 이것으로 나를 도울 수 있기를 바랍니다.

+1

죄송하지만 RTFM. "_'TreeSet' 인스턴스는 'compareTo (또는 비교)'method_"를 사용하여 모든 요소 비교를 수행합니다. 귀하의'compareTo' 메쏘드는 필요에 따라'equals()'와 일치하지 않습니다. –

답변

0

저는 항상 여기에서 질문하는 것을 꺼려했습니다. 내가 제출하자마자 해결 했어. 너와 이것을 공유하고 싶었다. TreeSetcompareTo 메소드에만 관심이 있습니다. 그래서 나는 그것을 다음과 같이 바꾸었다. 지금은 대등 한 계약 유형 특성의 "인식"때문에

@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"); 
    } 
} 

는 그것을 해결.