多次元とジャグ配列
多次元とジャグ配列
このレッスンでできるようになることは、行ごとに長さが違う配列を作り、その長さと中身を正しく追えることです。
Java の二次元配列は配列の配列
Java に本当の意味の二次元配列はありません。int[][] は「int 配列を要素に持つ配列」です。だから行ごとに長さを変えられます。行の長さが不揃いな配列をジャグ配列と呼びます。ジャグとはギザギザという意味です。
int[][] t = new int[3][];
t[0] = new int[]{1};
t[1] = new int[]{1, 2};
t[2] = new int[]{1, 2, 3};new int[3][] は、行の数だけを決めて中身は決めない書き方です。この時点で t.length は 3 ですが、t[0] はまだ null です。null のまま t[0].length を読むと NullPointerException になります。「コンパイルエラーになる」と答えさせる選択肢が定番ですが、コンパイルは通ります。実行時の例外です。
逆に new int[][3] は書けません。左の角括弧を空にしたまま右だけ数を書くことはできず、コンパイルエラーです。省略できるのは右側からです。
長さの取り方
行の数は t.length、ある行の長さは t[i].length です。ジャグ配列では行ごとに t[i].length が変わるので、内側のループの条件を t[0].length で固定して書くと、その行より長い行で ArrayIndexOutOfBoundsException になります。内側は必ず t[i].length にします。
波括弧でも不揃いに書ける
int[][] u = {
{1},
{1, 2},
{1, 2, 3}
};宣言と同時なら波括弧の入れ子でも書けます。この形でも各行の長さは自由です。int[][] v = new int[2][3]; のように両方の数を書いた場合は長方形になり、全要素が既定値の 0 で埋まります。
角括弧の位置
int[][] a、int[] a[]、int a[][] の 3 つはすべて同じ意味で、すべて合法です。ここでも試験は読みにくい書き方をわざと選んできます。角括弧の合計が 2 つなら二次元、と数えれば判断できます。
要件
- t は
new int[3][]で作り、各行をあとから代入する - row が 0 以上なら その行を
Arrays.toStringで返す - row が -1 なら
t.length、t[0].length、t[2].lengthをカンマでつないで返す - row が -2 なら
new int[2][]の 0 行目をString.valueOfに渡した結果を返す
入出力例
jag(0) → "[1]"
jag(2) → "[1, 2, 3]"
jag(-1) → "3,1,3"
jag(-2) → "null"