繁体   English   中英

与2个Enum相当的实现

[英]Implement comparable with 2 Enums

我正在创建一个模拟Hearts游戏的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 :Club-> Diamond-> Spade-> Heart进行排序,并且还按Value对其进行排序,例如:Club(2- > Ace),钻石(2-> Ace)等

任何帮助将非常感激

枚举已经有一个compareTo 这取决于枚举常量的序数值。 按出现顺序将枚举赋予枚举。

但是,对于有心人和许多游戏来说,一张牌的价值取决于游戏的状态 所以,虽然你可以使用默认compareToValues比较相同颜色的卡,你还需要确定圈内卡的实际价值。 在心里使用颜色内的顺序没有意义。 您当然不应该在card类中创建compareTo

对于纸牌游戏,必须谨慎使用compareTo ,并且不应使其动态化。 如果顺序不是问题中的默认顺序,则不要使用该顺序。 请记住, compareTo用于在具有自然顺序的一组元素内进行比较。 在许多纸牌游戏中,纸牌的价值随游戏而波动,因此没有这种自然顺序。


但是如果需要,您可以为每个回合创建一个新的Comparator器,该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);
    }
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM