【问题标题】:How to reference Enums using integers for use in arrays如何使用整数引用枚举以在数组中使用
【发布时间】:2013-01-11 22:35:53
【问题描述】:

我正在尝试用卡片对象创建一副牌。这个卡片对象有两个enums,一个int和一个boolean,如下图。为了创建这个套牌,我需要循环浏览套装和面值。

不幸的是,如果我必须按名称引用每个 enum 值,即 card[0] = new Card(Suit.Spade, Face.two, j, false);,这将需要 4*13 个 if 语句来完成。

我需要知道的是,是否有一种方法可以通过而不是 Suit.Spade 来设置每张卡片的 enum 值,例如 suit.int,这样下面的代码就可以在没有 52 个 if 语句的情况下工作。 i 只是算牌,Suit.j, Face.k 只是我正在寻找的一个例子。

    int i = 0;
    int j = 1;
    int k = 1;


    while(j <= suitCount)
    {
        k = 0;
        while(k <= faceCount)
        {
            card[i] = new Card(Suit.j, Face.k, i, false);

            k++;
            i++;
        }
        j++;
    }

【问题讨论】:

    标签: java arrays oop enums


    【解决方案1】:

    尝试类似:

    int i = 0;
    List<Card> cards = new ArrayList<>(Suit.values().length * Face.values().length);
    for (Suit suit : Suit.values()){
        for (Face face : Face.values()){
            cards.add(new Card(suit, face, i, false));
            i++;
        }
    }
    

    【讨论】:

    • 比我的回答还要好。 +1
    • cards.add(new Card(suit, face, i++, false) +1
    • @StephenP 是的,我知道您可以内联 i++,但有时人们更喜欢将它放在单独的行上以提高可读性。所以我遵循了OP提供的样式。
    【解决方案2】:

    使用隐式静态#values() 方法。

    Suit[] allSuits = Suit.values();
    Face[] allFaces = Face.values();
    
    // ...
    
    card[i] = new Card(allSuits[j], allFaces[k], i, false);
    

    http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

    【讨论】:

    • 这是正确的,但您应该只在循环外检索一次值并将它们保存在 Suit[] 和 Face[] 中。
    • @JohnWatts 这就是// ... 的意思。
    【解决方案3】:
    int i = 0;
    for (Suit s : Suit.values())
    {
      for (Face f : Face.values())
      {
         card[i] = new Card(s, f, i, false);
         i++;
      }
    }
    

    也许

    【讨论】:

      【解决方案4】:

      与 puce 的答案基本相同,但由于我花时间将其全部输入...

      package com.example.cards;
      
      public class Card
      {
          private Suit suit;
          private Rank rank;
      
          public Card(Suit suit, Rank rank)
          {
              this.suit = suit;
              this.rank = rank;
          }
      
          public enum Suit {
              SPADE, HEART, CLUB, DIAMOND;
          }
      
          public enum Rank {
              ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
              EIGHT, NINE, TEN, JACK, QUEEN, KING
          }
      
          /* Test building a deck of cards */
          public static void main(String[] args)
          {
              Card[] deck = new Card[52];
              int i = 0;
      
              for (Suit suit : Suit.values()) {
                  for (Rank rank : Rank.values()) {
                      deck[i++] = new Card(suit, rank);
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2010-09-29
        • 2015-08-03
        • 2018-01-17
        相关资源
        最近更新 更多