前回の記事では「配列って何?たくさんのデータをスッキリ整理整頓しよう! | ToolDocs」ってことで、Javaの配列の基本を学んだよね!一つの箱に色々なものをまとめて入れられる、便利なデータ構造だってことが分かったと思うんだ。
今回は、その配列がさらにパワーアップした「多次元配列」について一緒に見ていこう!「多次元」って聞くと、なんか難しそう…って思うかもしれないけど、実はめちゃくちゃ便利で、大活躍すること間違いなしなんだ!
多次元配列って、結局何者?
前回の記事で学んだ普通の配列は、言ってみれば「一列に並んだ棚」みたいなものだったよね。例えば、今日の献立を順番に並べるとか、テストの点数をずらっと並べるとか。
じゃあ、多次元配列ってどんなイメージかっていうと、ズバリ「複数の棚が並んだロッカー」とか「表計算ソフトのシート」みたいなものなんだ!
例えば、こんな状況を想像してみてほしい。
- 出席番号順に座席が決まっているクラスの座席表
- とある映画館の座席予約システム
- ゲームのマップデータ
これらって、一つの情報(例えば生徒の名前とか、座席の予約状況とか)だけじゃなくて、縦と横、つまり「行」と「列」の情報が組み合わさって初めて意味を持つものだよね?
そんな時に便利なのが、この多次元配列なんだ!
まずは基本の「2次元配列」から!
多次元配列と一口に言っても、一番よく使うのは「2次元配列」っていうやつなんだ。これは、まさに「表」のイメージ!
例えば、こんな表をJavaで作ってみよう。
| | 月 | 火 | 水 | 木 | 金 |
| 1時間目 | 国語 | 算数 | 理科 | 社会 | 英語 |
| 2時間目 | 算数 | 国語 | 理科 | 社会 | 英語 |
| 3時間目 | 理科 | 算数 | 国語 | 社会 | 英語 |
これを2次元配列で表現すると、こんな感じになるよ!
Java
String[][] timetable = {
{"国語", "算数", "理科", "社会", "英語"}, // 1時間目
{"算数", "国語", "理科", "社会", "英語"}, // 2時間目
{"理科", "算数", "国語", "社会", "英語"} // 3時間目
};
どうかな? String[][] ってなってるのがポイントだよ!String の後ろに [] が2つ並んでるよね。これが「2次元配列だよ!」ってJavaに教えてあげてるサインなんだ。
イメージとしては、
- 最初の
[]が「行」を表す箱 - 次の
[]が「列」を表す箱
って考えると分かりやすいかもしれないね。
2次元配列の要素にアクセスしてみよう!
前回の配列と同じように、2次元配列の要素にもインデックス(添え字)を使ってアクセスするよ。ただし、今回は「行」と「列」の2つのインデックスが必要になるんだ。
例えば、さっきの時間割で「水曜日の2時間目の科目」を知りたいとするよね。
水曜日は上から数えて3番目(インデックスは2、0から始まるからね!)、2時間目は上から数えて2番目(インデックスは1)だよね。
だから、こう書くんだ!
Java
String subject = timetable[1][2]; // 2時間目(インデックス1)の「水曜日」(インデックス2)
System.out.println("水曜日の2時間目は " + subject + " です。");
// 実行結果: 水曜日の2時間目は 国語 です。
どうかな?インデックスの順番は [行のインデックス][列のインデックス] って覚えておくと間違いにくいよ。
2次元配列の初期化とサイズ指定
さっきは最初から値を全部決めて配列を作ったけど、空っぽの2次元配列を作って後から値を入れ込むこともできるんだ。
例えば、3行5列の空っぽの時間割を作りたい場合はこう書くよ。
Java
String[][] emptyTimetable = new String[3][5];
これで、emptyTimetable[0][0] から emptyTimetable[2][4] までのマス目がある2次元配列ができたことになるね。
値を代入したいときは、前と同じようにインデックスを指定してあげるだけ!
Java
emptyTimetable[0][0] = "国語"; // 1時間目の月曜日
emptyTimetable[1][2] = "理科"; // 2時間目の水曜日
// どんどん入れていこう!
多次元配列は2次元だけじゃない!3次元、4次元…と増やせる!
「多次元配列」って名前の通り、次元は2次元だけじゃないんだ!3次元配列、4次元配列…と、理論上はいくらでも次元を増やすことができるよ。
でも、安心してください!初心者のうちは、ほとんど2次元配列までしか使わないことが多いから、まずは2次元配列をしっかり理解すればOK!
あえて3次元配列の例を出すなら、こんな感じかな?
とあるビルの会議室の予約状況
- 階数 (1次元目)
- 部屋番号 (2次元目)
- 時間帯 (3次元目)
みたいに、複数の要素が絡み合う複雑なデータを扱う場合に3次元配列が役立つんだ。
例えば、
Java
boolean[][][] conferenceRoomBooking = new boolean[5][10][24]; // 5フロア、各フロア10部屋、24時間
// 3階の5番の部屋の午後3時(インデックス15)が予約されているか?
boolean isBooked = conferenceRoomBooking[2][4][15];
こんな風に使うんだね。でも、ごちゃごちゃしてくるから、最初は「ふーん、こんなのもあるんだな」くらいで大丈夫!
2次元配列をループで処理してみよう!
2次元配列のすべての要素にアクセスしたいときは、ループを組み合わせるとすごく便利だよ。特に、for ループを入れ子にして使うことが多いんだ。
さっきの時間割を全部表示してみよう!
Java
String[][] timetable = {
{"国語", "算数", "理科", "社会", "英語"},
{"算数", "国語", "理科", "社会", "英語"},
{"理科", "算数", "国語", "社会", "英語"}
};
// 外側のループで行(時間)を回す
for (int i = 0; i < timetable.length; i++) {
System.out.print((i + 1) + "時間目: "); // 時間表示
// 内側のループで列(曜日)を回す
for (int j = 0; j < timetable[i].length; j++) {
System.out.print(timetable[i][j] + " ");
}
System.out.println(); // 改行
}
/* 実行結果:
1時間目: 国語 算数 理科 社会 英語
2時間目: 算数 国語 理科 社会 英語
3時間目: 理科 算数 国語 社会 英語
*/
ポイントは timetable.length と timetable[i].length だよ。
timetable.length: 配列全体の行数(ここでは3)timetable[i].length:i番目の行の列数(ここでは各行5)
この組み合わせで、きれいに全ての要素を処理できるんだ。

paizaで実行した結果
多次元配列の活用例:ゲームのマップデータ
例えば、簡単なRPGゲームを作るとしよう。マップはこんな感じ。
草原 森 川
森 草原 山
村 草原 森
これを2次元配列で表現すると…
Java
String[][] map = {
{"草原", "森", "川"},
{"森", "草原", "山"},
{"村", "草原", "森"}
};
// プレイヤーが今いる場所が「村」だとすると
int playerX = 2; // X座標(列)
int playerY = 0; // Y座標(行)
System.out.println("プレイヤーは現在「" + map[playerY][playerX] + "」にいます。");
// 実行結果: プレイヤーは現在「村」にいます。
こんな風に、ゲームのマップデータとか、ブロック崩しのブロックの配置とか、色々なものを2次元配列で表現できるんだ。卒業設計で何かゲームっぽいものを作るなら、多次元配列は必須アイテムになるよ!

paizaで実行した結果
欠陥配列(Jagged Array)って何?
Javaの多次元配列には、ちょっと面白い特徴があるんだ。それは、各行の列数がバラバラでもOKってこと!これを「欠陥配列(Jagged Array)」って呼ぶんだ。
例えば、こんな感じ。
Java
int[][] irregularArray = {
{1, 2, 3},
{4, 5},
{6, 7, 8, 9}
};
System.out.println(irregularArray[0].length); // 実行結果: 3
System.out.println(irregularArray[1].length); // 実行結果: 2
System.out.println(irregularArray[2].length); // 実行結果: 4
それぞれの行の長さが違うのが分かるかな?こういう配列も作れるんだ、ってことだけ頭の片隅に置いておくと、いつか役に立つかもしれないね!

paizaで実行した結果
まとめ
今回は「多次元配列」について学んだね!
- 多次元配列は「表」や「ロッカー」みたいなイメージで、複数の情報を組み合わせるのに便利!
- 一番よく使うのは「2次元配列」で、
[行のインデックス][列のインデックス]で要素にアクセスするよ。 - ループを組み合わせると、多次元配列のすべての要素を効率よく処理できる!
- ゲームのマップデータなど、複雑なデータの表現に大活躍!
これで君も、卒業設計で複雑なデータ構造を扱うのが怖くなくなったかな?多次元配列を使いこなせば、プログラミングの世界がもっと広がるはずだよ!


コメント