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()));
            }
        }
    }
}

また、カード クラスのコードはここにあります。また、デッキ コンストラクターの配列値が 1 ずつ減少する理由を誰か教えてもらえますか?最初の値は 1 なので、これは単に原因とエラーではないでしょうか?. ありがとう。

4

3 に答える 3

4

本体が異なるため、ループは2回繰り返されます。

  • コンストラクター内のループDeck()はカードを初期化します
  • 内部のループmainがカードを印刷します。

2つのメソッドは同じ順序でそれを実行します。そのため、ループのヘッダーは同じです。

Java(およびC、C ++、C#、および他の多くの言語)では、配列インデックスは1から番号付けされるのではなく、0から番号付けされるため、番号は1ずつ調整されます。一方、カードプログラムの定数は1から始まるため、配列のインデックス付けの方法に合わせて数値を調整するには、定数から1を引く必要があります。

于 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の値。


2番目のループグループ:

    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

どちらの場合も、その理由は2次元配列があるためです。外側の配列はスーツ、内側の配列はランクです。配列を使用する場合は、さまざまなカウント変数を使用して配列を調べる必要があります。たとえば、外側のループを4回実行したいが、内側のループを13回実行したいとします。

于 2013-02-26T19:33:59.990 に答える