3

我正在关注官方的 java 教程,我想知道为什么在两个类中都重复了 for 循环。

public class Deck {

    public static int numSuits = 4;
    public static int numRanks = 13;
    public static int numCards = numSuits * numRanks;

    private Card[][] cards;

    public Deck() {
        cards = new Card[numSuits][numRanks];
        for (int suit = Card.DIAMONDS; suit <= Card.SPADES; suit++) {
            for (int rank = Card.ACE; rank <= Card.KING; rank++) {
                //Don't understand why rank is decreased by one
                cards[suit-1][rank-1] = new Card(rank, suit);
            }
        }
    }

    public Card getCard(int suit, int rank) {
        return cards[suit-1][rank-1];
    }
}


      public class DisplayDeck {
    public static void main(String[] args) {
        Deck deck = new Deck();
        for (int suit = Card.DIAMONDS; suit <= Card.SPADES; suit++) {
            for (int rank = Card.ACE; rank <= Card.KING; rank++) {
                Card card = deck.getCard(suit, rank);
                System.out.format("%s of %s%n",
                    card.rankToString(card.getRank()),
                    card.suitToString(card.getSuit()));
            }
        }
    }
}

卡类的代码也可以在这里找到也有人能告诉我为什么甲板构造函数中的数组值减一吗?因为初始值是一,这不会导致错误吗?谢谢。

4

3 回答 3

4

循环重复两次,因为它们的主体不同:

  • 构造函数内的循环Deck()初始化卡片
  • 里面的循环main打印卡片。

这两种方法以相同的顺序执行,这就是循环的标题相同的原因。

数字调整为 1,因为在 Java(以及 C、C++、C# 和许多其他语言)中,数组索引是从零开始编号的,而不是从一开始编号的。另一方面,卡片程序中的常量是从一开始的,因此您必须从它们中减去一个以使数字与数组的索引方式对齐。

于 2013-02-26T19:25:19.613 回答
1

我不知道您在说哪对循环,但我会尽力解决。

第一个循环组

    for (int suit = Card.DIAMONDS; suit <= Card.SPADES; suit++) {
        for (int rank = Card.ACE; rank <= Card.KING; rank++) {
            //Don't understand why rank is decreased by one
            cards[suit-1][rank-1] = new Card(rank, suit);
        }
    }

构建甲板。外层循环遍历花色,内层循环遍历值。结果是完整的 52 张牌。每套13个值。


第二个循环组:

    for (int suit = Card.DIAMONDS; suit <= Card.SPADES; suit++) {
        for (int rank = Card.ACE; rank <= Card.KING; rank++) {
            Card card = deck.getCard(suit, rank);
            System.out.format("%s of %s%n",
                card.rankToString(card.getRank()),
                card.suitToString(card.getSuit()));
        }
    }

以与第一个相同的方式迭代。适合外循环,值内循环。但这一次,它实际上并没有构建牌组,而是打印牌组中内容的结果。

于 2013-02-26T19:25:29.430 回答
0

在这两种情况下,原因都是因为您有一个二维数组。外阵是花色,内阵是军衔。使用数组,您必须使用不同的计数变量来遍历它们。例如,您希望外循环运行 4 次,但您希望内循环运行 13 次。

于 2013-02-26T19:33:59.990 回答