複雑なデータは多次元配列で乗り切ろう!

docs

前回の記事では「配列って何?たくさんのデータをスッキリ整理整頓しよう! | 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.lengthtimetable[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次元配列」で、[行のインデックス][列のインデックス] で要素にアクセスするよ。
  • ループを組み合わせると、多次元配列のすべての要素を効率よく処理できる!
  • ゲームのマップデータなど、複雑なデータの表現に大活躍!

これで君も、卒業設計で複雑なデータ構造を扱うのが怖くなくなったかな?多次元配列を使いこなせば、プログラミングの世界がもっと広がるはずだよ!

コメント

タイトルとURLをコピーしました