繁体   English   中英

从 Java 中的枚举中检索一个值

[英]Retrieve a value from an Enum in Java

下面是Deck和Card两个类。 这些被用于二十一点游戏,因此我试图获得卡片的价值。 这些值当前存储在枚举中,但是我似乎无法弄清楚如何从枚举中获取值。

以下是我尝试过的步骤: 1. 创建一手牌 class,它通过创建 class 的实例然后使用方法 deck.deal 处理牌组中的两张牌。 2. 尝试从发牌中获取排名值。 这是我的方法失败的地方。 我试图从 Enum 中获取值,但我似乎无法访问它们。 例如,如果deck.deal 给了我梅花5 和红心6,我似乎无法拿到这些牌并运行Rank.getvalues 的方法。

这里最好的方法是什么?

public class Deck {

    private final Stack<Card> deckCards;


    public Deck() {
        this.deckCards = initDeck();
    }

    private Stack<Card> initDeck() {

        final Stack<Card> deckCards = new Stack<>();
        for (final Card.Suit suit : Card.Suit.values()) {
            for (final Card.Rank rank : Card.Rank.values()) {
                deckCards.push(Card.getCard(rank, suit));
            }
        }
        Collections.shuffle(deckCards);
        return deckCards;
    }

    public Optional<Card> deal() {
        return this.deckCards.empty() ? Optional.empty() :
                Optional.of(this.deckCards.pop());
    }

}
public class Card implements Comparable <Card> {

    private final Rank rank;
    private final Suit suit;

    private final static Map<String, Card> Card_Cache = initCache();

    public static Map<String, Card> initCache(){
        final Map<String, Card> cache = new HashMap<>();
        for(Suit suit: Suit.values()){
            for(Rank rank: Rank.values()){
                cache.put(cardKey(rank, suit), new Card(rank,suit));
            }
        }

        return Collections.unmodifiableMap(cache);
    }

    public static Card getCard (final Rank rank, final Suit suit){

        final Card card = Card_Cache.get(cardKey(rank, suit));

        if(card != null){
            return card;
        }

        throw new RuntimeException("Invalid card!");

    }

    private static String cardKey(final Rank rank, final Suit suit) {
        return rank + " of " + suit;
    }

    public Card(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return String.format("%s of %s", this.rank, this.suit);
    }

    @Override
    public int compareTo(Card o) {
        final int rankComparison = Integer.compare(this.rank.getRankValue(), o.rank.getRankValue());

        if(rankComparison != 0){

        }
        return Integer.compare(this.suit.getSuitValue(), this.suit.getSuitValue());
    }

    enum Suit{
        diamonds(1),
        clubs(2),
        hearts(3),
        spades(4);


        private final int suitValue;

        Suit(final int suitValue){
            this.suitValue = suitValue;
        }

        public int getSuitValue(){
            return this.suitValue;
        }

    }

    enum Rank{two(2), three(3), four(4), five(5), six(6),
        seven(7), eight(8), nine(9), ten(10), jack(11),
        queen(12), king(13), ace(14);

        private final int rankValue;

        Rank(final int rankValue){
            this.rankValue = rankValue;
        }



        public int getRankValue(){
            return this.rankValue;
        }

    }

public class Hand {

    private Optional<Card> card1;
    private Optional<Card> card2;
    Deck mynewdeck = new Deck();

    public Hand() {
        this.card1 = mynewdeck.deal();
        this.card2 = mynewdeck.deal();
    }

//    public String getvalue(){
//        get
//    }

    public Optional<Card> getCard1() {
        return card1;
    }

    public void setCard1(Optional<Card> card1) {
        this.card1 = card1;
    }

    public Optional<Card> getCard2() {
        return card2;
    }

    public void setCard2(Optional<Card> card2) {
        this.card2 = card2;
    }
}

下面是我的主要 class。 其中包括一系列尝试(似乎都不起作用),以便访问手 class 给我的牌的等级值。 希望这使我的尝试和方法更加清晰

public class Main {


    public static void main(String[] args) {

        Hand myhand = new Hand();



        System.out.println(myhand.getCard1());
        System.out.println(myhand.getCard2());
        System.out.println(myhand.getCard1(Card.Rank.valueOf();// incorrect

        Card mytestcard = new Card(Card.Rank.seven, Card.Suit.spades);
        System.out.println("this is the card value " + Card.Rank.valueOf(Card.Rank.seven.toString()));
        // incorrect


        String myfirstcard = (myhand.getCard1().toString()); // incorrect
        System.out.println(Card.Suit.valueOf(myfirstcard)); // incorrect



    }


}

您应该在卡片 class 中为“Suit”和“Rank”创建 getter,以便访问它们,例如:

public Suit getSuit() {
   return suit;
}

public Rank getRank() {
   return rank;
}

现在,您可以从 main 调用:

myhand.getCard1().getSuit().getSuitValue();
or
myhand.getCard1().getRank().getRankValue();

我最终想出了解决方案。 基本上访问修饰符是错误的。 在卡片 class 中,我将 Rank 和 Suit 更改为 public,然后我可以访问 getRankvalue。

暂无
暂无

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

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