嵌套for循环和对象数组

时间:2014-05-20 11:37:37

标签: java loops for-loop nested

我的另一个问题被标记为重复,我没有解释得太好,所以我再试一次。

所以我正在制作这个java黑杰克控制台游戏,并在这里偶然发现了一堵小墙。我已经准备好了一个名为Card的课程。现在我有点磕磕绊绊地创建了所有52张牌到一系列牌。好吧,我制作了有效的代码,但对于我来说,有三个嵌套for循环似乎很难看。有没有真正的方式"做我在这做的事。

所以这里将是班级Card

的一部分
int value;
String suit;
String name;

public void Card(int value, int suitNumber)
    this.value=value;
    switch(suitNumber){
        case 1 : this.suit = "Heart";
        break;
        .......
    }
switch(value){
case 1 : this.name="Ace";
......
}

Pack类的一部分有一个嵌套的for循环:

 Card[] packOfCards = new Card[51];


 for(int k=0; k<52; ){
     for(int i=1; i<5; i++){
         for(int j=1; j<14; j++){

        packOfCards[k] = Card(j, i);
        k++;

        // it seems stupid for me to have 3 nested
        //loops like that
         }
     }
 }

2 个答案:

答案 0 :(得分:1)

你需要循环:

  • 您牌组中的每个位置
  • 每个可能的卡片值(可能需要嵌套循环;获取每件西装的每个值,反之亦然)

目前,您似乎正在对两者进行循环。

以下代码使用第一种方法:

for(int i = 0; i < 52; i++) {
    int suit = (i % 13) + 1;
    int value = (i / 13) + 1;

    packOfCards[i] = new Card(value, suit);
}

此代码使用第二种(双循环)方法:

for (int i = 1; i <= 4; i++) {
    for (int j = 1; j <= 13; j++) {
       int cardIndex = (13 * (i-1)) + j;
       packOfCards[cardIndex] = new Card(j, i);
    }
}    

另请注意,您的Card课程看错了。当我认为你想要一个构造函数时,你已经声明了void方法,然后在创建 new 卡时错过了new关键字(提示:编译器会提醒你很多这些错误)。

正如其他人所建议的那样,使用enums作为卡片值和套装的类型可能更有意义,而不是在intString之间进行操作。

import java.util.ArrayList;
import java.util.List;

public class Card {

    private final CardValue value;
    private final Suit suit;

    public Card(CardValue value, Suit suit) {
        this.value = value;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return value + " of " + suit;
    }

    public static void main(String[] args) {
        List<Card> deck = new ArrayList<Card>();

        for (Suit s : Suit.values()) {
            for (CardValue v : CardValue.values()) {
                deck.add(new Card(v, s));
            }
        }

        for (Card c : deck) {
            System.out.println(c);
        }

        Card aceOfSpades = new Card(CardValue.withValue(1), Suit.SPADES);
        System.out.println(aceOfSpades);
    }

    public enum Suit {
        HEARTS ("Hearts"),
        CLUBS ("Clubs"),
        DIAMONDS ("Diamonds"),
        SPADES ("Spades");

        private final String name;

        Suit(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return this.name;
        }
    }

    public enum CardValue {
        TWO(2, "Two"),
        THREE(3, "Three"),
        FOUR(4, "Four"),
        FIVE(5, "Five"),
        SIX(6, "Six"),
        SEVEN(7, "Seven"),
        EIGHT(8, "Eight"),
        NINE(9, "Nine"),
        TEN(10, "Ten"),
        JACK(11, "Jack"),
        QUEEN(12, "Queen"),
        KING(13, "King"),
        ACE(1, "Ace");

        private final int value;
        private final String name;

        CardValue(int value, String name) {
            this.value = value;
            this.name = name;
        }

        public int getValue() {
            return value;
        }

        public static CardValue withValue(int value) {
            for (CardValue v : CardValue.values()) {
                if (value == v.value) {
                    return v;
                }
            }
            return null;
        }

        @Override
        public String toString() {
            return this.name;
        }
    }
}

你可能想把enum拉成单独的文件,但为了产生一个相对简洁的工作例子,我将它们放在主类中。

答案 1 :(得分:1)

通过一个for循环可以获得相同的结果,通过节省更多时间复杂度而不是三个循环和重复。尝试,

 for (int k = 1; k <= 52; k++) {
   int i = k % 5;
   int j = k % 14;

   packOfCards[k-1] = new Card(j, i);
 }