[英]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.