【Javaプログラミング超入門 #18 最終回】配列(2):多次元配列

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は

Java超入門 #18
配列(2):多次元配列

というテーマでお送りします。

今回は、超入門の最終回です。

Java概要・環境構築~基本文法を一通り見てきました。

ここまで見て頂けたかたは、理解が進んでいると思います。
学びの意欲が、とても素晴らしいと思います。

本当に、ありがとうございます。

そして、最終回は多次元配列の話をしていきます。

彩香
Javaの超入門を学んできましたが最終回ですね。
今回も、学びを深めます。よろしくお願いします。
剛留
失敗もしてきましたが、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さんの社会の点数を表す要素。

内部的なデータは、このように構成されています。

このイメージを持っていること、大切ですので
押さえておきましょうね。

彩香
2次元配列は1次元配列の参照値の配列なんですね。
このイメージで考えるようにします。

【3】宣言の方法

2次元配列の場合
型名[][] 配列名 = new 型名[2次元配列の要素数][];
配列名[0] = new 型名[1次元配列の要素数];
配列名[1] = new 型名[1次元配列の要素数];
 :

(1次元配列の要素数が全て同じ場合)
型名[][] 配列名
= new 型名[2次元配列の要素数][1次元配列の要素数];

※2次元配列の要素数は、1次元配列の配列数。

5科目の点数を表す1次元配列を
3人分管理する2次元配列 の場合には…

int[][] score = new int[3][5];

となります。

また、初期化の記述については
以下のように記述できます。

int[][] score = {
    {83, 77, 91, 68, 84},
    {78, 66, 81, 92, 59},
    {94, 81, 79, 86, 79}
};

{}(中括弧で囲んだ)1次元配列の初期化を複数書いて…

それをカンマで区切って、更に全体を {}(中括弧)で
囲む形をとなります。

内側が1次元配列、その1セットを
カンマで区切って並べるイメージとなります。

剛留
1次元で何を表しているのか、2次元で何を表しているのか…

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

【4】要素の表し方

2次元配列の各要素の表し方は、こうなります。

配列名[2次元配列の要素番号][1次元配列の要素番号]

さきほどの例の場合、
1次元配列で各教科の点数(国語…)
ですので、1次元配列の要素番号は 0 ~ 4。

2次元配列では、その1次元配列のを持つ
各受講者(3人分)の配列を表します。

ですので、2次元配列の要素番号は 0 ~ 2。

このように、右から1次元、2次元となります。

例えば、Aさん(0番目)の英語(2番目)の要素に
90 を代入する場合には

score[0][2] = 90;

と記述します。

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

result = score[2][3];

と記述します。

【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):『配列』の繰り返し(ループ)

【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人分)の処理をした後に 改行をしています。

以前にお話したように、大枠から詳細に考えて
プログラムを組み立てていきましょうね。

彩香
length の表現方法が面白いですね。

2次元配列の要素数。
2次元配列の要素が参照する1次元配列の要素数。

ここも、イメージで捉えるようにします。

剛留
2次元配列、バッチリです。
そして、プログラムも組み立ても 段々と分かってきました。
演習問題を解いていきます。

【 まとめ 】

● 多次元配列

【1】多次元配列
・ 1次元配列を2つ以上まとめて
  あつかう配列が2次元配列。

・ 2次元配列を2つ以上まとめて
  あつかう配列が3次元配列。

・ 2次元配列以上が多次元配列。

【2】配列のイメージ
・ 2次元配列は1次元配列の
  参照値を配列として扱う。 

・ 内部的なデータの持ち方を
  イメージする事が大切。

【3】宣言の方法
・ 宣言の方法
  型名[][] 配列名
    = new 型名[2次元の要素数][1次元の要素数];

※2次元配列の要素数は、1次元配列の配列数。

・ 初期化の方法
  int[][] score = {
   {83, 77, 91, 68, 84},
   {78, 66, 81, 92, 59},
   {94, 81, 79, 86, 79}
  };

【4】要素の表し方
・ 配列名[2次元の要素番号][1次元の要素番号]

・ 右から1次元、2次元 となる。

【5】length
・ 2次元の場合

➊ 配列名.length は 2 次元目の要素数

❷ 配列名[n].length は 2次元目の
  要素番号 n に対する 1次元配列の要素数。