ジャグ配列(jagged array)は「配列の配列」です。各行の長さが異なる可変長のデータを表現できます。int[][] のように [] を二重に書くことで宣言します。
多次元配列がすべての行で列数が同じ矩形グリッドなのに対し、ジャグ配列は各行が独立した配列であり、行ごとに長さを変えられます。
外側の配列(黄色)が各行への参照を持ち、各行(青)は独立した 1 次元配列です。
書式:ジャグ配列の宣言
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 }
};
書式:ジャグ配列の要素アクセス
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
| 比較項目 | 多次元配列 int[,] |
ジャグ配列 int[][] |
|---|---|---|
| 形状 | すべての行が同じ列数(矩形) | 行ごとに列数が異なる |
| 宣言 | new int[3, 4] |
new int[3][] + 各行の初期化 |
| アクセス | a[i, j] |
a[i][j] |
Length |
全要素数(行 × 列) | 行数のみ |
| メモリ | 一続きの連続領域 | 行ごとに別々の領域 |
| 向いている用途 | 行列演算・グリッドマップ | 三角形データ・可変長行のデータ |
int[,]int[][]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 です。必ず行ごとに初期化が必要です。
型[][])は「配列の配列」で、行ごとに長さが異なるデータを表現できるnew 型[行数][] で生成し、各行を別途 new 型[]{ ... } で初期化するa[行][列] の 2 段階int[][] data = new int[4][] を生成した直後、data[0] の値は何ですか?jagged[1].Length は何を返しますか?{1}, 行 1 に {1,2}, 行 2 に {1,2,3} を格納し、すべての要素を出力するコードを書いてください。null です。外側の配列が生成されただけで、各行はまだ初期化されていません。
jagged[1] の要素数(列数)を返します。行によって異なります。
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# クラスとオブジェクト セクションでクラス・メソッド・プロパティを学びます。