CodeGym /コース /C# SELF /二次元配列

二次元配列

C# SELF
レベル 7, レッスン 4
使用可能

1. はじめに

普通の配列って、ピザの箱みたいに長くて全部のピースが一列に並んでる感じだよね ― 美味しいけど、ちょっと単調。

でも、作業スケジュールとかチェス盤を想像してみて。そこではすべてが行と列で整理されてる ― つまりテーブルだよね。これがまさに二次元配列の典型的な使い道なんだ。

現実世界では二次元配列ってめっちゃよく出てくるよ:

  • 社員の給料テーブル(行は社員、列は月)
  • 画面の画像(各「マス」はピクセルの色、XとYの2つの座標)
  • マトリックス計算やデータ処理
  • チェス盤や三目並べのボード

二次元配列は時々マトリックスとも呼ばれるよ(これは数学から来た言葉)。

プログラマーとして二次元配列が必要になる場面は本当に多い。ほとんどのボードゲームの実装は、もうそのまま二次元配列だよ:「チェス」、「チェッカー」、「三目並べ」、「海戦」などなど:

二次元配列 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以上 ― あまり使わないけど、高度な数学やシミュレーション、機械学習などで出てくることもあるよ。
2
タスク
C# SELF, レベル 7, レッスン 4
ロック未解除
2次元配列の初期化と要素の出力
2次元配列の初期化と要素の出力
2
タスク
C# SELF, レベル 7, レッスン 4
ロック未解除
2次元配列の各行の要素の合計を計算しよう
2次元配列の各行の要素の合計を計算しよう
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION