
今回は
というテーマでお送りします。
今回は、超入門の最終回です。
Java概要・環境構築~基本文法を一通り見てきました。
ここまで見て頂けたかたは、理解が進んでいると思います。
学びの意欲が、とても素晴らしいと思います。
本当に、ありがとうございます。
そして、最終回は多次元配列の話をしていきます。

今回も、学びを深めます。よろしくお願いします。

今回も、ガッツリ理解していきます。よろしくお願いします。

【Youtube版】
Youtubeでもお伝えしていますので
是非チェックしてくださいね。
【1】多次元配列

ひとくくりにして管理すること。
と「配列(1)」で学びましたね。
この時に学んだ配列は、データを一列に
並べて扱うイメージでした。
この配列を1次元配列といいます。

そして、1次元配列を2つ以上まとめて
扱う配列を2次元配列といいます。

更に、2次元配列を
2つ以上まとめで扱う配列を3次元配列といいます。

このようにして、配列の次元は
まとまりの単位を上げていく感じです。
また、2次元配列以上の配列を
多次元配列といいます。
【2】配列のイメージ

Javaが コンピュータ内でデータを扱う時の
配列のイメージを掴んでおきましょう。
ここでは、2次元配列を考えます。
まず、今まで考えてきた1次元配列。
これは、箱が並んでいるイメージでしたね。
例えば、int型の配列に 5 教科の点数を格納して
処理することを考えましょう。
国語・算数・英語・理科・社会の点数を
順番に格納する配列 score があるとします。
添字(インデックス)は、[0] ~ [4] でしたね。
score[0] ~ score[4] と表します。

そして、今回は、この 5 教科の点数の配列が
3 人分あったとしましょう。
Aさん、Bさん、Cさんの得点です。
コンピュータの内部では、この2次元配列を
1次元配列の参照値の配列として扱います。

score[0] は Aさんの 5教科の点数配列の
参照値を示す要素。
score[1] は Bさんの 5教科の点数配列の
参照値を示す要素。
score[2] は Cさんの 5教科の点数配列の
参照値を示す要素。

そして、各点数の要素については…

score[0][0] は Aさんの国語の点数を表す要素。
score[0][1] は Aさんの算数の点数を表す要素。
score[0][2] は Aさんの英語の点数を表す要素。
:
:
…とずっときて…
:
score[2][2] は Cさんの英語の点数を表す要素。
score[2][3] は Cさんの理科の点数を表す要素。
score[2][4] は Cさんの社会の点数を表す要素。

内部的なデータは、このように構成されています。
このイメージを持っていること、大切ですので
押さえておきましょうね。

このイメージで考えるようにします。
【3】宣言の方法

配列名[0] = new 型名[1次元配列の要素数];
配列名[1] = new 型名[1次元配列の要素数];
:
(1次元配列の要素数が全て同じ場合)
型名[][] 配列名
= new 型名[2次元配列の要素数][1次元配列の要素数];
※2次元配列の要素数は、1次元配列の配列数。
5科目の点数を表す1次元配列を
3人分管理する2次元配列 の場合には…
となります。
また、初期化の記述については
以下のように記述できます。
{83, 77, 91, 68, 84},
{78, 66, 81, 92, 59},
{94, 81, 79, 86, 79}
};
{}(中括弧で囲んだ)1次元配列の初期化を複数書いて…
それをカンマで区切って、更に全体を {}(中括弧)で
囲む形をとなります。
内側が1次元配列、その1セットを
カンマで区切って並べるイメージとなります。

それを意識すると、初期化もスンナリ書けそうです。
しっかり、ノートしておきました。
【4】要素の表し方

2次元配列の各要素の表し方は、こうなります。
さきほどの例の場合、
1次元配列で各教科の点数(国語…)
ですので、1次元配列の要素番号は 0 ~ 4。
2次元配列では、その1次元配列のを持つ
各受講者(3人分)の配列を表します。
ですので、2次元配列の要素番号は 0 ~ 2。
このように、右から1次元、2次元となります。
例えば、Aさん(0番目)の英語(2番目)の要素に
90 を代入する場合には

と記述します。
Cさん(2番目)の理科(3番目)の要素を参照して
変数 result に代入する場合には

と記述します。
【5】length

配列の要素数を表す length について見ていきましょう。
今回の例で考えた場合
score.length は 2 次元配列の要素数です。
つまり score[0]、score[1]、score[2] で 3 となります。

score[0].length は score[0][0] ~ score[0][4] で 5です。

そして、
score[1].length、score[2].length も同様に考えて 5 となります。

間違いやすいのが、点数の要素が 15 個あるので
score.length は 15 と考えてしまう場合。
ここは、段階的に考える事を大切にしましょう。
【6】配列処理の例

2次元配列に対して繰り返し処理を行う例を
見ていきましょう。
(参考)
1次元配列の繰り返し処理については
以下の記事でお伝えしています。併せて参考にしてくださいね。
【Javaプログラミング超入門 #16】繰り返し(4):『配列』の繰り返し(ループ)
さて、今回は2次元配列をループで処理する場合を
考えていきましょう。
1次元目が 5教科の点数。
2次元目が 3人分です。

まずは、配列の宣言です。
1次元配列の要素の初期化と…
それぞれの1次元配列の「参照値の配列」(2次元配列)
の初期化も行われます。
右側の図の イメージ を持つようにしましょうね。

処理の大枠では、人数分の処理を行うことを考えます。
ここで、score.length という記述は 2次元目の
要素数ですので、3となります。

という事で、この forループは、初期化式が i = 0、
条件式が i < 3、条件変化式が i++ となります。
ループカウンタ i が、0, 1, 2 と処理します。
最初のforループの中を見ていきましょう。
ここで、score[i].length とありますが
それぞれの 人の 点数配列の要素数を表すので5となります。

したがって、この内側の forループは、初期化式が j = 0、
条件式が j < 5 、条件変化式は j++ となります。
ループカウンタ j が、0, 1, 2, 3, 4 と処理します。
そして forループの中は、System.out.println で
点数配列の要素に、スペース1文字を連結して表示しています。
score[i][j] の示す配列要素は…
i = 0 の 時には、要素番号 [0][0] から [0][4] となります。

i = 1 の 時には、要素番号 [1][0] から [1][4] となり…
i = 2 の 時には、要素番号 [2][0] から [2][4] となります。
このあたり、混乱しないように、今までの説明をつなげて
考えてみましょうね…。ゆっくりで大丈夫です。
そして、外側の forループの処理としては
1行(1人分)の処理をした後に 改行をしています。
以前にお話したように、大枠から詳細に考えて
プログラムを組み立てていきましょうね。

2次元配列の要素数。
2次元配列の要素が参照する1次元配列の要素数。
ここも、イメージで捉えるようにします。

そして、プログラムも組み立ても 段々と分かってきました。
演習問題を解いていきます。
【 まとめ 】

● 多次元配列
あつかう配列が2次元配列。
・ 2次元配列を2つ以上まとめて
あつかう配列が3次元配列。
・ 2次元配列以上が多次元配列。
参照値を配列として扱う。
・ 内部的なデータの持ち方を
イメージする事が大切。
型名[][] 配列名
= new 型名[2次元の要素数][1次元の要素数];
※2次元配列の要素数は、1次元配列の配列数。
・ 初期化の方法
int[][] score = {
{83, 77, 91, 68, 84},
{78, 66, 81, 92, 59},
{94, 81, 79, 86, 79}
};
・ 右から1次元、2次元 となる。
➊ 配列名.length は 2 次元目の要素数
❷ 配列名[n].length は 2次元目の
要素番号 n に対する 1次元配列の要素数。
今回も、ご覧いただき、ありがとうございます。