配列の要素には数値や文字列だけでなく、別の配列を格納することができます。つまり、配列の配列のまた更なる配列といった多次元にわたる配列も表現することができます。
Javaにおける多次元配列とは、配列の配列であり、1つ以上の配列を要素として含む配列であることを意味します。多次元配列を宣言するには、以下のように記述します。配列型は、データ型とそれに続く[]演算子によって記述されましたが、[]の数は配列の入れ子の深さを表します。
dataType[][] arrayName;
また、多次元配列の宣言と作成を同時に行うこともできます。
dataType[][] arrayName = new datatType[size1][size2];
ここでsize1, size2は各次元での配列の大きさを表します。それでは、2×3のint型の二次元配列を作成してみましょう。
public class Main {
public static void main(String[] args) {
// 2×3の二次元配列
int[][] arr2d = new int[2][3];
// lengthプロパティで特定の次元の配列のサイズを取得することができます
for (int i = 0; i < arr2d.length; i++) {
for (int j = 0; j < arr2d[i].length; j++) {
// arrayName[][]でアクセス
System.out.println(arr2d[i][j]);
}
}
}
}
以下のように二次元配列を初期化することもできます。
int[][] arr2d = { {1,2,3}, {4,5,6} };
Javaでは、配列はオブジェクトであり、配列を作成するときは、要素の配列への参照を含むオブジェクトを作成することになります。上の例では、arr2dは配列の配列であり、arr2dの各要素は整数の配列です。arr2dの要素は、配列そのものではなく、個々の配列への参照です。
例えば、arr2dの最初の要素は{1,2,3}であり、これは整数の配列です。この配列への参照はarr2dの最初の要素に格納されます。演算子==を使用すると、要素そのものではなく、配列の中の参照を比較することができます。
public class Main {
public static void main(String[] args) {
int[][] arr2d = { {1,2,3}, {4,5,6} };
// 配列の参照にアクセス
System.out.println(arr2d[0]);
System.out.println(arr2d[1]);
// == で配列の参照を比較
int[] arr = new int[]{1,2,3};
System.out.println(arr2d[0] == arr);
}
}
ArraysクラスのdeepToStringメソッドを使用すると、多次元配列を文字列として表示することができます。三次元配列を例として見てみましょう。
// Arraysクラスのimport
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[][][] arr3d = {
{
{3,4,3},
{4}
},
{
{1,3,5},
{2,7,8}
},
{
{1,2},
{9,7,8}
}
};
System.out.println(Arrays.deepToString(arr3d));
// for文で1つ1つ出力
// 配列やコレクションの要素を繰り返し処理するために、for-eachループが使えます
// for(item : iterable)
for (int[][] array2d: arr3d) {
for (int[] array1d: array2d) {
for(int item: array1d) {
System.out.println(item);
}
}
}
}
}
一次元の動的配列を表す際はArrayList<Integer>でした。二次元の場合、一次元配列の配列なので、ArrayList<ArrayList<Integer>>となります。それでは、ArrayListを使って二次元配列を作成してみましょう。
// ArrayListクラスのimport
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> arr2d = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> row1 = new ArrayList<>();
row1.add(1);
row1.add(2);
row1.add(3);
arr2d.add(row1);
ArrayList<Integer> row2 = new ArrayList<>();
row2.add(4);
row2.add(5);
row2.add(6);
arr2d.add(row2);
System.out.println(arr2d);
// ArrayListのgetメソッドは、インデックスの要素を取得可能
System.out.println(arr2d.get(0));
System.out.println(arr2d.get(1));
}
}
ArraysクラスのasListメソッドを使うことでより簡単に動的配列を初期化することができます。
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<ArrayList<Integer>> array2d = new ArrayList<ArrayList<Integer>>();
// Array.asList() に可変長引数を渡し、ArrayListでラップします
// add()メソッドは、JavaのArrayListクラスのメソッドで、リストの末尾に要素を追加するために使用されます。
// この場合、add()メソッドはarray2dというArrayListオブジェクトに対して呼び出されており、引数として新しいArrayListオブジェクトが渡されています。
array2d.add(new ArrayList<Integer>(Arrays.asList(1,2,3)));
array2d.add(new ArrayList<Integer>(Arrays.asList(4,5,6)));
System.out.println(array2d);
}
}