实施与2枚枚举相当

时间:2014-11-24 00:42:46

标签: java enums comparable

我正在创建一个模拟一场Heart游戏的Java程序。我有另一个卡片游戏模拟的Card课程:

public abstract class Card  implements Comparable<Card>{

    public enum Suits {
        SPADES,
        CLUBS,
        HEARTS,
        DIAMONDS
    }

    public enum Values {
        TWO,
        THREE,
        FOUR,
        FIVE,
        SIX,
        SEVEN,
        EIGHT,
        NINE,
        TEN,
        JACK,
        QUEEN,
        KING,
        ACE, 
    }

    private Suits suit;
    private Values value;

    public Card(final Values value, final Suits suit) {
        this.value = value;
        this.suit = suit;
    }

    public Values getValue() {
        return value;
    }

    public Suits getSuit() {
        return suit;
    }

    public void showCard() {
        value = getValue();
        suit = getSuit();

        System.out.println(value + " of " + suit);
    }

    private int compareTo(final Card comparedToCard) {
        //code here
    }

}

我需要一些实施compareTo方法的帮助。我有使用此方法的经验,以及它应如何根据您想要比较对象的方式返回1,0或-1。但是,我以前从未使用enums实现它。我知道Enum类实现了可比性,但即使在查看API文档后,我也不知道如何比较两个枚举。

我希望的结果是对ArrayList<Card>进行排序,使其首先按Suit排序:俱乐部 - &gt;钻石 - &gt; Spade - &gt;心脏,并且也按Value排序,所以:俱乐部(2&gt; Ace),钻石(2&gt; Ace)等...

非常感谢任何帮助

3 个答案:

答案 0 :(得分:2)

Enum已经有compareTo。这个取决于枚举常数的序数值。顺序按照外观顺序给予枚举。

对于心灵和许多游戏而言,牌的价值取决于游戏的状态。因此,虽然您可以使用compareTo的默认Values来比较相同颜色的卡片,但仍需要确定转弯中卡的实际值。在心中使用颜色中的顺序是没有意义的。 您当然不应在卡片类中创建compareTo

对于纸牌游戏,compareTo应谨慎使用,不应动态。如果订单不是您问题中的默认订单,那么根本不要使用它。请记住,compareTo用于在一组带有自然顺序的元素中进行比较。在许多纸牌游戏中,牌的价值随着游戏而波动,所以没有这样的自然秩序。


如果必须,你可以为每个转弯创建一个新的Comparator,这个只是赞成任何与第一张牌相同的套牌。由于第一张卡片应始终位于已检查的卡片列表中,因此单张纸牌应该总是有赢家。

public class TurnComparator implements Comparator<Card> {
    private final Suits firstCardSuite;

    TurnComparator(Suits firstCardSuite) {
        this.firstCardSuite = firstCardSuite;
    }

    @Override
    public int compare(Card o1, Card o2) {
        if (o1.suit != firstCardSuite && o2.suit != firstCardSuite) {
            return 0;
        }

        if (o1.suit != firstCardSuite && o2.suit == firstCardSuite) {
            return -1;
        }


        if (o1.suit == firstCardSuite && o2.suit != firstCardSuite) {
            return 1;
        }

        return o1.value.compareTo(o2.value);
    }
}

答案 1 :(得分:1)

Java中的每个枚举常量作为关联的序数值。可以通过在常量上调用ordinal()方法来访问此值,例如SPADE.ordinal()。

一旦所有枚举联系人按其值的升序排列,我们可以使用序数来执行您需要的那种比较。

答案 2 :(得分:0)

枚举具有自然顺序,因此请根据套装属性进行比较,然后按值进行比较:

@Override
public int compareTo(Card o)
{
    return Comparator.comparing(Card::getSuit)
                     .thenComparing(Card::getValue)
                     .compare(this, o);
}

或者如果你想要一个比较器:

Comparator<Card> comp = Comparator.comparing(Card::getSuit)
                                  .thenComparing(Card::getValue);