我正在尝试测试一个测试任务扑克游戏的课程,其中确定特定手牌的有效性或价值非常重要。
我的PokerHand
对象包含TreeSet<Card>
。我认为这将是一个理想的数据结构,因为不允许使用双精度数,并且它使用红黑树算法自动对其进行排序。
但问题是,它似乎有一些我尚未意识到的副作用。我知道双打不会被添加到TreeSet
,但在我的测试中我确保不会。相反,我注意到,只要Card
字段相等,它就不会向TreeSet添加新的number
对象,而不是类型。
这是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;
}
这是测试,添加各种卡片......
@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
,因此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,也许我只是在清楚地监督某些事情。我希望有人可以帮助我推进这项工作。
答案 0 :(得分: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");
}
}
这解决了它,因为现在可比较的合同是&#34;意识到&#34;属性类型。