1

私は Java の初心者で、以前に多次元配列について質問されたことがありますが、明確で簡潔な回答はありませんでした。

たとえば、2 次元配列が次のように初期化される場合:

int[][] a = {{1,2,3}}

これは単純に、要素「1」が「行 1、列 1」、要素「2」が「行 1、列 2」であることを意味しますが、どうでしょうか。

int[][][] b = {{1,2,3}}

3次元配列bの要素「1」は「1 x, 1 y, 1 z」ということですか?

次のような多次元配列はどうでしょうか。

int[][][][] c = {{1,2,3}}

それをどのように想像しますか?これは、私が読んだすべての教科書に、2 次元配列以上の配列が記述されていないためです。無数の次元配列が存在すると彼らは簡単に言うでしょう。しかし、私はそれらを想像することができません。

この質問にできるだけ明確に答えて、他のユーザーが答えを読むだけで多次元配列を完全に把握できるようにしてください。

4

5 に答える 5

3

あなたのコード例はどれも合法的な Java ではありません。この宣言:

int[][] a;

aの配列の配列であることを宣言しますint。(Java には実際には 2 次元配列はありません。) 配列の配列で初期化できます。

int[][] a = { {1, 2, 3}, {4, 5, 6} };

ただし、 はではなく であるため、 で初期化する{1, 2, 3}こと{1, 2, 3}はできません(つまり、「の配列」は「の配列の配列」と同じ型ではありません)。int[]int[][]intint

同様の考慮事項は、他のケースにも当てはまります。例えば:

int[][][][] c;

の配列の配列の配列の配列を宣言しますint

配列の配列の基本概念を理解すれば、特定の宣言を理解するのは難しくありません。例えば:

int[][][] b = new int[3][4][2];

bは長さ 3 の配列であると宣言します。 の各要素bは 4 つの配列の配列であり、それぞれが 2 つのint値の配列です。通常どおり、すべてのint値は 0 に初期化されます。末尾のディメンションを初期化する必要はありません。

int[][][] b = new int[3][][];

b長さが 3 の配列であることを宣言します。各要素は でなければなりませんが、int[][]最初はすべての要素が になりますnull

要素の長さが同じである必要はありません。したがって、たとえば、b[1]長さ 7 の配列に設定され、b[2]長さ 12 の配列に設定される場合があります。

Java 言語仕様では、配列の作成について詳しく説明しています。

于 2013-04-26T01:44:49.650 に答える
2

@Ted Hoppの回答と合わせて読んでください。

あなたが与えた例が有効なJavaではない理由を説明したいだけです。

int[][] a = {{1,2,3}}

これは (現在) 有効です (最後のセミコロンがないことを除けば)

int[][][] b = {{1,2,3}}

配列初期化子が 2 次元配列を指定しており、それを 3 次元配列に割り当てているため、これは無効です。

int[][][][] c = {{1,2,3}}

配列初期化子が 2 次元配列を指定し、それを 4 次元配列に割り当てているため、これは無効です。

実際、これにより、これらの場合に何が起こるかについての懸念が解消されるはずです。答えは何もありません。コードは違法です。宣言された配列型と初期化子の次元は同じでなければなりません


このように作成された長方形配列(またはN次元の類似物)に関して。

int[][][][] d = new int[4][5][6][7];

各次元の長さは、初期化子から簡単に読み取ることができます。つまり、4x5x6x74 次元行列に相当する Java を宣言しています。これはコードでも実行できます。

System.out.println(d.length);   // prints 4 
System.out.println(d[0].length);   // prints 5 
System.out.println(d[0][0].length);   // prints 6
System.out.println(d[0][0][0].length);   // prints 7

不規則な配列でもこれを行うことができます...ただし、さまざまなサブ配列の長さが均一ではないことがわかります。むしろ、それぞれのサブ配列が初期化子にあった大きさなどに依存します。


これは、私が読んだすべての教科書に、2 次元配列以上の配列が記述されていないためです。

教科書の著者を弁護するために:

  1. 実際の Java プログラムが 2 次元を超える配列を使用することは珍しく、{{{...}}}スタイル初期化子を使用して配列を初期化することはさらに異常です。

  2. 実際、1 次元および 2 次元の配列に使用される同じパターンは、自然で明白な方法でより高次元の配列に拡張されます(または、少なくとも、ほとんどの Java プログラマーにとってそれは自然で明白なことです...)

したがって、教科書の余分なページを使って「明白」で「めったに使用されない」ものを説明することは、正当化するのが困難です。

そして FWIW、典型的な Java の教科書は、ラベルへのブレーク、初期化ブロック、変数名の「$」、Java の名前解決規則など、Java 言語の他のあいまいなコーナーについても言及していません。これはおそらく A GOOD THING 1です。


1 - うん... 「1066 とそのすべて」をもう一度読んでいます。

于 2013-04-26T02:11:23.820 に答える
0

私自身、多次元配列に初めて出会ったとき、この概念に苦労しました。

まず、2D 配列をイメージと考えてください。各要素はピクセルです。

3D 配列はムービーです。[i, j, k] の要素は、ムービーのフレーム k の座標 (i, j) のピクセルです。

4D 配列は、複数のカメラで構成される動画です。[i, j, k, l] は、l 番目のカメラの k 番目のフレームの座標 (i, j) にあるピクセルです。

そのような多次元配列についてしばらく考えてみてください。しばらくすると、その次元性を完全に無視するようになります。

幸運を!

于 2013-04-26T01:46:06.577 に答える
0

実際、Java は配列の配列を意味するジャグ配列を使用します。

int[][] array = {{1, 2}, {3, 4}};

C# などの他の言語では、(ギザギザ配列以外に) 多次元配列があります。

string[,] array = new string[2,3];
于 2013-04-26T01:48:33.350 に答える