通过枚举作为参数循环

时间:2012-12-18 02:21:38

标签: java loops enums iteration

所以我用Java编写了二十一点,我已经存储了我的套装并在枚举中对值进行了排名

public enum Suit
{
   spades, hearts, clubs, diamonds
}



public enum Rank
{
    two, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
}

我有一个Deck类,它保留了一堆'卡'。 卡片包含适合和等级的字段。

public class Card
{
    static Suit suit;
    static Rank rank;


    Card(Suit suit, Rank rank)  
    {

    this.suit = suit;
    this.rank = rank;

    }


    public String toString()
    {
    return rank + " of " + suit;
    }

    //getters and setters ommitted
}

Deck中的构造函数应该遍历每个套装并排名并将这些作为参数传递给它们以创建一副52张牌,但它似乎被卡在每个牌的最后一个值上,最终得到52'aces俱乐部。我不明白为什么,因为套装和等级似乎正确打印,它似乎是当它们作为参数传递给add()时他们行为不端。

public class Deck
{
    static Stack<Card> d = new Stack<Card>();

    Deck()
    {
    if (!d.isEmpty())
    {
        clear(); //Empties the stack if constructor is called again
    }

    for (Suit suit : Suit.values())
    {
        for (Rank rank : Rank.values())
        {
        //System.out.println(suit + " " + rank);
        //This seems to print the right values

        add(new Card(suit, rank)); //These are stuck on 'clubs' and 'ace'
        }
    }

    System.out.println(d);

    shuffle(); //Method which shuffles the deck

    }

    public static void add(Card c)
    {
    d.addElement(c);
    }

    //shuffle(), clear() and other methods omitted
}

如果有帮助,可以在github上看到整个项目。

3 个答案:

答案 0 :(得分:4)

卡片中的套装和等级字段不应该是静态的!

你的甲板领域也不应该!

静态字段是每个类,因此每次调用时,您的Card构造函数都会覆盖相同的值。

答案 1 :(得分:0)

这是不正常的。您可以从Deck扩展Stack

public class Deck
{
    static Stack<Card> d = new Stack<Card>();

在这种情况下,您可以直接在add上致电clearshuffleDeck

public class Deck extends Stack<Card> {
    //add, clear are already there from Stack
}

答案 2 :(得分:0)

您可以在枚举上调用values()方法。

for ((Rank rank : Rank.values()) {
  // do what you want
}

此值()方法 由编译器隐式声明 。所以它没有在Enum doc上列出。