TreeSet无法正确添加不同的数据

时间:2017-01-15 20:18:52

标签: java treeset

我正在尝试测试一个测试任务扑克游戏的课程,其中确定特定手牌的有效性或价值非常重要。

我的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,也许我只是在清楚地监督某些事情。我希望有人可以帮助我推进这项工作。

1 个答案:

答案 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;属性类型。