2

3 つの配列があるとします。

char [] one = {'a','b','c'};
char [] two = {'1','2','3'};
char [] three = {'x','y','z'};

このように印刷したい場合:

a 1 x
a 1 y
a 1 z

a 2 x
a 2 y
.....
c 3 z

ネストされたループを 3 つ作成する必要があります。

for(char i : one)
  for(char j : two)
    for(char k : three)
       //.....

7 つの配列がある場合、7 つのネストされたループになるとします。

それを行うためのより良い方法やAPIはありますか? なぜそんなことをするのかと思うかもしれませんが、それは単なる考え方の問題です。

4

5 に答える 5

5

トリックは、インデックスの配列を使用することです。車の走行距離計のようにそれらを更新します。最下位のインデックスで、オーバーフローがゼロに設定された場合は次のインデックスに移動します...オーバーフローがない場合、更新が完了します。さあ、印刷してください。最後のインデックスのオーバーフローが発生すると、印刷が行われます。

// Accept an array of character arrays and print a nest
// of their contents.
static void print(char [] [] a) {
    int n_arrays = a.length;
    int [] indices = new int[n_arrays];  // All set to 0 by java
    // Decrement so that first increment is to all zeros. Avoids test for empty arrays.
    indices[n_arrays - 1] = -1; 
    for (int j = 0;;) {
        // Increment indices.
        for (j = n_arrays - 1; j >= 0; j--) {
            if (++indices[j] >= a[j].length) {
                indices[j] = 0;
            }
            else {
                break;  // No overflow. Increment is complete.
            }
        }
        if (j < 0) {
            break; // Last index overflowed.  We're done.
        }
        // Print.
        for (int i = 0; i < n_arrays; i++) {
            System.out.print(a[i][indices[i]]);
        }
        System.out.println();
    }
}

// Varargs version.
static void printArgs(char [] ... a) {
    print(a);
}

static char [] one = {'a','b','c'};
static char [] two = {'1','2','3'};
static char [] three = {'x','y','z'};

public static void main(String[] a) {
    print(new char [] [] { one, two, three } );
    printArgs(one, two, three);
}
于 2013-08-03T02:32:07.357 に答える
3

これは、便利な varargs パラメータを使用する再帰的なソリューションであり、任意の数の配列に対して機能します。

public static String combinations(String s, char[]... arrays) {
    if (arrays.length == 0) return s + "\n";
    String result = "";
    for (char c : arrays[0])
        result += combinations(s + c, Arrays.copyOfRange(arrays, 1, arrays.length));
    return result;
}

それほど効率的ではありませんが、短時間です。

空白の文字列で直接呼び出して開始することもできますが、パブリック ラッパー関数を使用すると、より優れた API が作成されます。

public static String combinations(char[]... arrays) {
    return combinations("", arrays);
}

ここにいくつかのテストコードがあります:

char[] one = { 'a', 'b', 'c' };
char[] two = { '1', '2', '3' };
char[] three = { 'x', 'y', 'z' };
char[] four = { 'm', 'n', 'o' };
System.out.println(combinations(one, two, three, four));

出力:

a1xm
a1xn
a1xo
a1ym
a1yn
a1yo
a1zm
a1zn
a1zo
a2xm
a2xn
a2xo
a2ym
a2yn
a2yo
a2zm
a2zn
a2zo
a3xm
a3xn
a3xo
a3ym
a3yn
a3yo
a3zm
a3zn
a3zo
b1xm
b1xn
b1xo
b1ym
b1yn
b1yo
b1zm
b1zn
b1zo
b2xm
b2xn
b2xo
b2ym
b2yn
b2yo
b2zm
b2zn
b2zo
b3xm
b3xn
b3xo
b3ym
b3yn
b3yo
b3zm
b3zn
b3zo
c1xm
c1xn
c1xo
c1ym
c1yn
c1yo
c1zm
c1zn
c1zo
c2xm
c2xn
c2xo
c2ym
c2yn
c2yo
c2zm
c2zn
c2zo
c3xm
c3xn
c3xo
c3ym
c3yn
c3yo
c3zm
c3zn
c3zo
于 2013-08-03T15:26:31.170 に答える