为什么同一个循环使用两次&为什么数组的值减少了?

时间:2013-02-26 19:20:23

标签: java

我正在关注官方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()));
            }
        }
    }
}

也可以找到卡类的代码here也可以有人告诉我为什么deck构造函数中的数组值减少了一个?,因为初始值是一个不会这只是原因和错误?。感谢。

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分: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()));
        }
    }

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

答案 2 :(得分:0)

在这两种情况下,原因都是因为你有一个二维数组。外部数组是套装,内部数组是等级。使用数组,您必须使用不同的计数变量来完成它们。例如,您希望外循环运行4次,但您希望内循环运行13次。