1. はじめに
普通の配列って、ピザの箱みたいに長くて全部のピースが一列に並んでる感じだよね ― 美味しいけど、ちょっと単調。
でも、作業スケジュールとかチェス盤を想像してみて。そこではすべてが行と列で整理されてる ― つまりテーブルだよね。これがまさに二次元配列の典型的な使い道なんだ。
現実世界では二次元配列ってめっちゃよく出てくるよ:
- 社員の給料テーブル(行は社員、列は月)
- 画面の画像(各「マス」はピクセルの色、XとYの2つの座標)
- マトリックス計算やデータ処理
- チェス盤や三目並べのボード
二次元配列は時々マトリックスとも呼ばれるよ(これは数学から来た言葉)。
プログラマーとして二次元配列が必要になる場面は本当に多い。ほとんどのボードゲームの実装は、もうそのまま二次元配列だよ:「チェス」、「チェッカー」、「三目並べ」、「海戦」などなど:
「チェス」や「海戦」のゲームボードは、二次元配列にピッタリ当てはまるんだ。マスの座標には数字だけ使えばOK。「ポーン e2 → e4」じゃなくて「ポーン (4,1) → (4,3)」みたいな感じ。プログラマー的にはこっちの方がずっと楽だよ。
2. 二次元配列の宣言構文
最初の宣言だけちょっと怖いかもだけど、やってみれば簡単!一歩ずつ見ていこう。
基本ルール
型[,] 配列名;
ここでカンマ,がカッコの中にあるのは、コーヒー飲みすぎたコンパイラのバグじゃなくて、「この配列は二次元だよ」って意味なんだ。
例
int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;
配列の作成
サイズを指定するよ:行数と列数。
matrix = new int[3, 4]; // 3行4列
これは3x4のテーブル:Excelで3行4列の表をイメージしてみて。
変数の宣言と同時に二次元配列を作ることもできる:
int[,] matrix = new int[3, 4];
値をすぐに初期化することもできる(一次元配列とほぼ同じ感じ):
int[,] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 3行3列のテーブル
注意:こうやって初期化する場合、すべての行は同じ長さじゃないとダメ。最初の行が3つ、2行目が2つ、みたいなのはNG。
ビジュアル図
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← 列 (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← 行0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← 行1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← 行2 (Row 2)
└─────┴─────┴─────┴─────┘
各要素は[行, 列]のペアで指定するよ。
3. インデックス指定と要素へのアクセス
二次元配列では、要素にアクセスするのに2つのインデックスを使うよ:
- 最初 ― 行番号
- 次 ― 列番号
matrix[1, 2] = 99; // 2行目(インデックス1)、3列目(インデックス2)
チェスに慣れてる人のために言うと、インデックスは0から始まるよ。つまり最初の要素は[0, 0]だよ。
書き込みと読み込み
int[,] data = new int[5, 2];
data[1, 1] = 5; // 書き込み
int value = data[1, 1]; // 読み込み
これがメモリ上でどう見えるかはこんな感じ:
4. 二次元配列の値を埋める
じゃあ、1から12までの連番でマトリックスを埋めるコードを書いてみよう。どう動くか分かりやすいよ。
int[,] matrix = new int[3, 4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row, col] = value;
value++;
}
}
ここでは外側のループが行、内側が列を回してるよ。
イラスト:
実行後:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. サイズ:行数と列数の取得
配列のサイズを「動的に」知りたいことってよくあるよね。C#ではGetLength()メソッドが便利だよ。
int[,] matrix = new int[3, 4];
int rows = matrix.GetLength(0); // 行数(1次元目)- 3
int columns = matrix.GetLength(1); // 列数(2次元目)- 4
Console.WriteLine($"行: {rows}, 列: {columns}");
Lengthと混同しないでね ― 二次元配列の場合これは全要素数(行×列)になるよ。
6. 二次元配列の画面出力
二次元テーブルを出力するには、だいたい二重ループを使う ― これはコンソールで迷路を描くみたいなもんだね。例:
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
Console.Write(matrix[row, col] + "\t"); // "\t" ― 見やすくするためのタブ
}
Console.WriteLine(); // 改行
}
出力例:
1 2 3 4
5 6 7 8
9 10 11 12
ちなみに、これでたった数行でテーブルを「きれいに描く」方法をマスターしたね!
7. 多次元配列
配列についてもう一つ面白い事実。二次元配列ができるなら、三次元配列もできるんじゃない?
そう、好きな次元数の配列を作れるよ。こういう配列は多次元配列って呼ばれる。
多次元配列の宣言方法
必要な次元数だけカンマで区切って書くだけ:
int[,,,] matrix = new int[2, 3, 4, 5];
ここでは四次元配列だよ:
- 1つ目の座標で2要素、
- 2つ目で3要素、
- 3つ目で4要素、
- 4つ目で5要素。
メモリ上では、こういう配列はでっかい「データのキューブ」が順番に詰め込まれてる感じ。
要素へのアクセス方法
すべてのインデックスを指定してアクセスするよ:
matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
- インデックスはC#ではいつも通り0から始まる。
- この配列には2 × 3 × 4 × 5 = 120個の要素が入るよ。
多次元配列の実用例
- 2D ― テーブル、チェス盤、画像など。
- 3D ― グラフィックの「キューブ」、科学計算用データ(例:空間と時間ごとの温度など)。
- 4D以上 ― あまり使わないけど、高度な数学やシミュレーション、機械学習などで出てくることもあるよ。
GO TO FULL VERSION