Unity & C# 学習教材

ジャグ配列

ジャグ配列(jagged array)は「配列の配列」です。各行の長さが異なる可変長のデータを表現できます。int[][] のように [] を二重に書くことで宣言します。

学習目標

前提知識


1. ジャグ配列とは

多次元配列がすべての行で列数が同じ矩形グリッドなのに対し、ジャグ配列は各行が独立した配列であり、行ごとに長さを変えられます。

外側の配列 jagged[0] 参照 jagged[1] 参照 jagged[2] 参照 3 要素 10 20 30 5 要素 1 2 3 4 5 2 要素 7 8

外側の配列(黄色)が各行への参照を持ち、各行(青)は独立した 1 次元配列です。


2. ジャグ配列の宣言と初期化

書式:ジャグ配列の宣言

1
型[][] 変数名 = new 型[行数][];
要素 説明
型[][] ジャグ配列の型。[][] が「配列の配列」を示す
new 型[行数][] 外側の配列(行への参照を格納)を生成する
1
2
3
4
5
6
int[][] jagged = new int[3][];   // 3 行の外側配列を確保(各行はまだ null)

// 各行を個別に初期化
jagged[0] = new int[] { 10, 20, 30 };      // 行 0: 3 要素
jagged[1] = new int[] { 1, 2, 3, 4, 5 };  // 行 1: 5 要素
jagged[2] = new int[] { 7, 8 };            // 行 2: 2 要素

初期化子をまとめて書くこともできます。

1
2
3
4
5
int[][] jagged = {
    new int[] { 10, 20, 30 },
    new int[] { 1, 2, 3, 4, 5 },
    new int[] { 7, 8 }
};

3. 要素へのアクセス

書式:ジャグ配列の要素アクセス

1
配列[行インデックス][列インデックス]
1
2
3
4
Console.WriteLine(jagged[0][1]);  // 20(行 0 の 2 番目)
Console.WriteLine(jagged[1][4]);  // 5(行 1 の末尾)

jagged[2][0] = 99;                // 値の書き換え

各行は独立した 1 次元配列なので jagged[i].Length でその行の要素数を取得できます。

1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 0; i < jagged.Length; i++)
{
    Console.Write($"行{i}({jagged[i].Length}要素): ");
    for (int j = 0; j < jagged[i].Length; j++)
    {
        Console.Write(jagged[i][j] + " ");
    }
    Console.WriteLine();
}
// 行0(3要素): 10 20 30
// 行1(5要素): 1 2 3 4 5
// 行2(2要素): 7 8

4. 多次元配列との比較

比較項目 多次元配列 int[,] ジャグ配列 int[][]
形状 すべての行が同じ列数(矩形) 行ごとに列数が異なる
宣言 new int[3, 4] new int[3][] + 各行の初期化
アクセス a[i, j] a[i][j]
Length 全要素数(行 × 列) 行数のみ
メモリ 一続きの連続領域 行ごとに別々の領域
向いている用途 行列演算・グリッドマップ 三角形データ・可変長行のデータ

使い分けの目安


よくあるミス

1
2
3
4
5
6
7
8
int[][] jagged = new int[3][];

// ❌ NG: 各行を初期化する前にアクセスすると NullReferenceException
Console.WriteLine(jagged[0][0]);  // NullReferenceException!

// ✅ OK: 各行を先に初期化してからアクセス
jagged[0] = new int[4];
Console.WriteLine(jagged[0][0]);  // 0

外側の配列を生成しただけでは各行は null です。必ず行ごとに初期化が必要です。


まとめ


理解度チェック

  1. ジャグ配列 int[][] data = new int[4][] を生成した直後、data[0] の値は何ですか?
  2. jagged[1].Length は何を返しますか?
  3. 3 行のジャグ配列で、行 0 に {1}, 行 1 に {1,2}, 行 2 に {1,2,3} を格納し、すべての要素を出力するコードを書いてください。
解答を見る
  1. null です。外側の配列が生成されただけで、各行はまだ初期化されていません。

  2. jagged[1] の要素数(列数)を返します。行によって異なります。

  3. 1
    2
    3
    4
    5
    6
    7
    8
    
    int[][] jagged = {
        new int[] { 1 },
        new int[] { 1, 2 },
        new int[] { 1, 2, 3 }
    };
    for (int i = 0; i < jagged.Length; i++)
        for (int j = 0; j < jagged[i].Length; j++)
            Console.WriteLine($"[{i}][{j}] = {jagged[i][j]}");
    

次のステップ

配列セクションはここで完結です。次は C# クラスとオブジェクト セクションでクラス・メソッド・プロパティを学びます。