2D 配列を作成するとき、行または列のどちらが最初に指定されたかをどのように覚えていますか?
9 に答える
Java は、「行優先」構成の配列と同様の配列を指定します。つまり、最初に行にインデックスを付けます。これは、2D 配列が「配列の配列」であるためです。
例えば:
int[ ][ ] a = new int[2][4]; // Two rows and four columns.
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
次のように視覚化することもできます。
a[0] -> [0] [1] [2] [3]
a[1] -> [0] [1] [2] [3]
2 番目の図は、「配列の配列」の側面を示しています。最初の配列には が含まれて{a[0] and a[1]}
おり、それぞれが 4 つの要素を含む配列{[0][1][2][3]}
です。
TL;DR の要約:
Array[number of arrays][how many elements in each of those arrays]
詳細については、配列 - 2 次元も参照してください。
Matt B の意見はある意味では正しいかもしれませんが、幾何行列についてまったく考えずに Java 多次元配列について考えてみると役立つかもしれません。Java multi-dim 配列は単に配列の配列であり、最初の「次元」の各要素は他の要素とは異なるサイズにすることができ、実際には null の「サブ」配列を実際に格納することができます。この質問の下のコメントを参照してください
本能的に、水平 (X) 軸と垂直 (Y) 軸という幾何学的に考えます。ただし、これは 2D 配列の場合には当てはまりません。行が最初に来て、次に列が来ます。
次の類推を考えてみましょう: 幾何学では、はしごまで歩いて (X 軸)、それを登ります (Y 軸)。逆に、Java では、はしごを降りて (行)、立ち去ります (列)。
すべては、配列の視覚化に依存します。行と列は、配列自体ではなく、配列の視覚化(おそらく想像の中で) のプロパティです。
数字の「5」は赤ですか緑ですか?と尋ねるのとまったく同じです。
赤でも描けるし、欲も描けるでしょ?色は数値の不可欠なプロパティではありません。同様に、2D 配列を行と列のグリッドとして表すことは、この配列の存在に必要ではありません。
2D 配列には1 番目の次元と2 番目の次元しかありません。それらの視覚化に関連するすべては、純粋にあなたの好みです。
char arraychar[80][25]
がある場合、スクロールせずに画面に収まる 80 文字の 25 行が表示されるように、コンソールを回転させて印刷したい場合があります。
2D 配列を行と列として表すことがまったく意味をなさない場合の実行可能な例を提供しようとします。1 000 000 000 整数の配列が必要だとしましょう。私のマシンには 8 GB の RAM が搭載されているので、これには十分なメモリがありますが、実行しようとするvar a = new int[1000000000]
と、OutOfMemory 例外が発生する可能性が高くなります。これは、メモリの断片化が原因です。このサイズの連続したメモリ ブロックはありません。代わりに、値を使用して 10 000 x 100 000 の 2D 配列を作成できます。論理的には 1D 配列なので、1 つの値のシーケンスとして描画して想像したいのですが、技術的な実装により 2D になっています。
Java には、多次元配列はありません。配列の配列があります。そう:
int[][] array = new int[2][3];
実際には 2 つの配列で構成され、それぞれに 3 つの要素があります。
Java では、2 次元配列は 2 つの別個の配列と見なされるため、行が最初に処理されます。最初の行 1 次元配列から開始します。
C ++(遠く離れたほこりの多いメモリ)では、Javaよりもコードを見て配列を理解するのが少し簡単だったと思います。どちらも行優先です。この図は、理解を助けるのに役立ちました。
文字列の 2 次元配列のこのコードを考えると...
String[][] messages;
messages = new String[][] {
{"CAT","DOG","YIN","BLACK","HIGH","DAY"},
{"kitten","puppy","yang","white","low","night"}
};
int row = messages.length;
int col = messages[0].length;
2 次元配列 (行、列) であるかのように int に名前を付けると、値が表示されます。
row = (int) 2
col = (int) 6
最後の 2 行のコードでは、サイズを決定して設定しようrow
とcol
していますが、それほど直感的には見えず、必ずしも正しいとは限りません。
ここで実際に扱っているのは次のとおりです (説明のために新しい変数名に注意してください)。
int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;
Wheremessages.length
は、messages
2 つの配列を保持していることを示しています。配列の配列。
AND は、内messages[x].length
の個々の配列のそれぞれのサイズを生成します。0
1
messages
numOfArraysIn = (int) 2
numOfElementsIn0 = (int) 6
numOfElementsIn1 = (int) 6
for each ループで印刷すると....
for (String str : messages[0])
System.out.print(str);
for (String str : messages[1])
System.out.print(str);
CATDOGYINBLACKHIGHDAYkittenpuppyyangwhitelownight
括弧を削除してこのように印刷しようとすると、エラーが発生します
for (String str : messages)
System.out.print(str);
incompatible types: String[] cannot be converted to String
.length
上記は、配列を介したステップを制限するために使用するループを設定する際に理解することが重要です。