簡體   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