0

コードは次のとおりです。

基本的に、このコードはスーツ + ランクの 52 枚のカードを出力します。

package javaapplication52;

public class JavaApplication52 {

    public static void deck() {

        String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" };
        String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack",
                "Queen", "King", "Ace" };

        // avoid hardwired constants
        int SUITS = suit.length;
        int RANKS = rank.length;
        int N = SUITS * RANKS;
        // initialize deck
        String[] deck = new String[N];
        for (int i = 0; i < RANKS; i++) {
            for (int j = 0; j < SUITS; j++) {
                deck[SUITS * i + j] = rank[i] + " of " + suit[j];

            }
        }
        // shuffle
        for (int i = 0; i < N; i++) {
            int r = i + (int) (Math.random() * (N - i));
            String t = deck[r];
            deck[r] = deck[i];
            deck[i] = t;
        }

        // print shuffled deck
        for (int i = 0; i < N; i++) {
            System.out.println(deck[i]);

        }

    }

    public static void main(String[] arg) {

        JavaApplication52 d = new JavaApplication52();

        d.deck();

    }
}

私には意味のわからなかったコード

deck[SUITS * i + j] = rank[i] + " of " + suit[j]

私が理解していなかったのは、なぜ彼らはSUITSを掛けてからjを足したのかということでした。混乱していたのは SUITS (これは 4 に等しい) で、i (これは 13 です) を乗算し、次に j ( ( 値は 4 です) を足しました) は 52 とはまったく等しくありません。この関数がどのように機能したかを説明してください。

4

5 に答える 5

4

次のような方法で 2D 配列を 1D 配列に入れるのは一般的なイディオムです。

for (row = 0; row < ROWS; ++row) {
    for (col = 0; col < COLUMNS; ++col) {
        array[row * ROWSIZE + col] = . . .
    }
}

これは、行列を「行優先順」に展開することと呼ばれます。つまり、各行は次の行で開始する前に埋められます。実際の行インデックスの代わりに、各行は 1D 配列の行番号 * 行サイズ (行サイズは列の数) で始まります。「COLUMNS」の代わりに「ROWSIZE」を使用すると、コードがより明確になります。

次のように、「列の優先順位」で行うこともできます。

. . . array[col * ROWS + row] = . . .

3 つの行と 4 つの列があるとします。最初のコードは、次のように配列を埋めます。

0 1 2 3 4 5 6 7 8 9 10 11

後者は次のように配列を埋めます:

0 4 8 1 5 9 2 6 10 3 7 11

...しかし、彼が次に行うことは配列をシャッフルすることなので、配列がどの順序で作成されたかは問題ではありません。

余談ですが、カードに文字列を使用するのはひどい考えです。ソフトウェアでのトランプの表現を確認してください。

于 2013-07-15T06:02:19.693 に答える
2

インデックス "i" は 0 から 12 までの値を取ります

于 2013-07-15T05:13:05.297 に答える
2
// avoid hardwired constants
    int SUITS = suit.length;
    int RANKS = rank.length;
    int N = SUITS * RANKS;
    // initialize deck
    String[] deck = new String[N];
    for (int i = 0; i < RANKS; i++) {
        for (int j = 0; j < SUITS; j++) {
            deck[SUITS * i + j] = rank[i] + " of " + suit[j];

        }
    }

SUITS の長さは 4、RANKS の長さは 12、N のサイズは 52 です (つまり、String[] デッキには 52 の位置があります)。

したがって、int i = 0; i < RANKS; i++は 0 から 12 になりint j = 0; j < SUITS; j++、0 から 3 になります。

したがって、4 * 12 + 351 - またはカード 52 です。

于 2013-07-15T05:16:15.997 に答える
1

シャッフルされる前に。基本的には、線形配列上の 2 次元配列です。

ARRAY[CURRENT_ROW][CURRENT_COLUMN]

= ARRAY[(NUMBER_OF_COLUMNS * CURRENT_ROW) + CURRENT_COLUMN]

インデックスCURRENT_ROWCURRENT_COLUMN0 から始まる場所

于 2013-07-15T06:40:38.257 に答える