配列は通常、横に並んだ箱に値を入れていくイメージだ。
より複雑にエクセルのような2次元的な配列を作ったり、それ以上の多次元配列を作ることもできる。
このページではJavaの多次元配列についてお伝えしていこう。
目次
Javaの多次元配列
多次元配列とは?
通常配列と言えば、1次元の配列を表している。同じ型の変数が一列に並んでいるようなものである。一列に並んだ配列変数の値をインデックス(先頭からの位置)で引き出すことができた。
2次元配列とは、次元がもうひとつ加わる。
1次元が直線ならば、2次元は平面である。縦方向の並びに横方向の並びが加わる。2次元の配列変数から値を取り出すためには、縦方向と横方向のふたつのインデックスで引き出す。
3次元はどうだろうか。次元がもうひとつ加わる。縦と横に高さが加わる。4次元になったら、どう考えたら良いだろうか。もっと多次元になったらどうか。3次元以上の多次元を現実世界に当てはめるのは難しい。
直感的に理解できる図にしたらこのようになる。配列が次の次元の配列を指している。この関係が次元の数だけある。そして、最後の次元の配列に値が入る。
多次元配列を扱うための準備
多次元配列を使うためには、その準備として配列を宣言し配列を生成する必要がある。これは、通常の配列と同じである。
宣言
多次元配列変数の宣言は、配列の型と次元がいくつあるかを宣言する。変数の型の後に[]をふたつ書けば2次元配列になる。3つ書けば3次元である。
その書き方の基本は簡単だ。
型 配列変数名[][]・・・;
int型の2次元配列の例を示す。
int[][] arrayOfIntTwoDimensions;
オブジェクトの配列変数も同じ書き方になる。
Object[][] arrayOfObjects;
2次元配列を宣言しても、それは配列の入れ物がどこにあるかを示す変数を定義しただけだ。次に、配列を生成することが必要である。
生成
配列の生成は、配列の大きさに応じて配列の要素を入れるための入れ物を確保することである。生成を行うためにはnew演算子を使い、配列の大きさを指定して、次のように書く。
配列変数名 = new 型[配列の要素数][配列の要素数]・・・;
例えば、次のコードは最初の配列の要素数が4個、2番目の配列の要素数が5個の配列を生成するint型の2次元配列の例を示す。さらに、要素数が6個の次元が加わった3次元の配列の例も示す。
1 2 3 |
arrayOfIntTwoDimensions = new int[4][5]; arrayOfIntThreeDimensions = new int[4][5][6]; |
オブジェクトの参照型の配列変数も同じ書き方になる。
1 2 3 |
Object[][] arrayOfObjectTwoDimensions = new Object[4][5]; Object[][] arrayOfObjectThreeDimensions = new Object[4][5][6]; |
では、どのようにこれらの配列にアクセスするのか見てみよう。
多次元配列へのアクセス
配列変数にアクセスするには、アクセスしたい要素の入っている配列のインデックスを指定して要素へアクセスする。この時、インデックスは0から始まることに注意しよう。
書き方の基本は簡単だ。
要素の値 = 配列変数[インデックス][インデックス]・・・;
int型の配列から値をとってくる例を見てみよう。先に例として挙げたint型の配列の場合はこうなる。
1 2 3 |
value = arrayOfIntTwoDimensions[2][3]; value = arrayOfIntTwoDimensions[2][3][4]; |
実際のプログラムで、配列の宣言からアクセスまでを見てみよう。
多次元配列のサンプルプログラム
このサンプルプログラムは、2次元配列をインデックスの合計の値で初期化し、その値を表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class TwoDimensions { public static void main(String[] args) { int[][] arrayOfInts;//[1] arrayOfInts = new int[3][4];//[2] for (int dimension1 = 0; dimension1 < arrayOfInts.length; dimension1++) {//[3] for (int dimension2 = 0; dimension2 < arrayOfInts[dimension1].length; dimension2++) {//4] arrayOfInts[dimension1][dimension2] = dimension1 + dimension2;//[5] } } for (int dimension1 = 0; dimension1 < arrayOfInts.length; dimension1++) {//[6] for (int dimension2 = 0; dimension2 < arrayOfInts[dimension1].length; dimension2++) {//[7] int value = arrayOfInts[dimension1][dimension2];//[8] System.out.println("[9] value[" + dimension1 + "][" + dimension2 + "]=" + value); } System.out.println("[10]"); } } } |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[9] value[0][0]=0 [9] value[0][1]=1 [9] value[0][2]=2 [9] value[0][3]=3 [10] [9] value[1][0]=1 [9] value[1][1]=2 [9] value[1][2]=3 [9] value[1][3]=4 [10] [9] value[2][0]=2 [9] value[2][1]=3 [9] value[2][2]=4 [9] value[2][3]=5 [10] |
多次元配列サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 配列変数arrayOfIntsを定義する。
- [2] 配列arrayOfIntsを最初の要素数を2、次の要素数を3で生成する。
- [3]-[5] 配列arrayOfInts[dimension1][dimension2]の全ての要素に、その配列のインデックスに応じてその合計dimension1 + dimension2を代入する。
- [6]-[10] 配列arrayOfIntsの全ての要素を表示する。
配列の初期化
配列に初期値を代入する方法として、次のようにひとつひとつ値を代入することができる。前のセクションのサンプルプログラムでは、forループで値を代入していたので、それほど大変そうに見えない。しかし、次のように書くのは大変なことだ。
1 2 3 4 5 6 7 8 |
int array[][]; array = new int[2][3]; array[0][0] = 0; array[0][1] = 1; array[0][2] = 2; array[1][0] = 3; array[1][1] = 4; array[1][2] = 5; |
これをまとめて書くことができる。
int array[][] = {{0,1,2}, {3,4,5}};
かなり簡単になる。
多次元配列の初期値設定サンプルプログラム
このサンプルプログラムは、2次元配列を定義すると同時に、初期値を代入する。その後、代入された値を表示している。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class ArrayInitializer { public static void main(String[] args) { int arrayOfInts[][] = {{0,1,2}, {3,4,5}};//[1] for (int dimension1 = 0; dimension1 < arrayOfInts.length; dimension1++) {//[2] for (int dimension2 = 0; dimension2 < arrayOfInts[dimension1].length; dimension2++) {//[3] int value = arrayOfInts[dimension1][dimension2];//[4] System.out.println("[5] value[" + dimension1 + "][" + dimension2 + "]=" + value); } System.out.println("[6]"); } } } |
実行結果
1 2 3 4 5 6 7 8 |
[5] value[0][0]=0 [5] value[0][1]=1 [5] value[0][2]=2 [6] [5] value[1][0]=3 [5] value[1][1]=4 [5] value[1][2]=5 [6] |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 配列変数arrayOfIntsを定義し、初期化する。
- [2]-[6] 配列arrayOfIntsの全ての要素を表示する。
配列を別々に生成
多次元配列の配列を生成するとき、配列の要素の数を最初から決めて生成しなくてもよい。その場の必要に応じて、配列を生成することが出来る。
このことをサンプルプログラムで見てみよう。
サンプルプログラム
このサンプルプログラムは、2次元配列の最初の要素数は3だが、その次の要素数は異なる数で生成している。その後、代入された値を表示している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ArrayCreation { public static void main(String[] args) { int arrayOfInts[][];//[1] arrayOfInts = new int[3][];//[2] for (int dimension1 = 0; dimension1 < arrayOfInts.length; dimension1++) {//[3] arrayOfInts[dimension1] = new int[dimension1 + 1];//[4] for (int dimension2 = 0; dimension2 < arrayOfInts[dimension1].length; dimension2++) {//[5] arrayOfInts[dimension1][dimension2] = dimension2;//[6] } } for (int dimension1 = 0; dimension1 < arrayOfInts.length; dimension1++) {//[7] for (int dimension2 = 0; dimension2 < arrayOfInts[dimension1].length; dimension2++) {//[8] int value = arrayOfInts[dimension1][dimension2];//[9] System.out.println("[10] value[" + dimension1 + "][" + dimension2 + "]=" + value); } System.out.println("[11]"); } } } |
実行結果
1 2 3 4 5 6 7 8 9 |
[[10] value[0][0]=0 [11] [10] value[1][0]=0 [10] value[1][1]=1 [11] [10] value[2][0]=0 [10] value[2][1]=1 [10] value[2][2]=2 [11] |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] 配列変数arrayOfIntsを定義する。
- [2] 配列arrayOfIntsを最初の要素数を3で生成する。
- [3]-[4] 配列arrayOfInts[dimension1][]の要素数をdimension1+1の数で生成する。
- [5]-[6] 配列のインデックスdimension2の値を代入する。
- [7]-[11] 配列arrayOfIntsの全ての要素を表示する。
まとめ
このページではJavaの多次元配列についてまとめてお伝えした。
多次元配列なしにプログラムを組むのはなかなか大変だ。はじめは難しいかもしれないが、使い方をマスターしてしまおう。
コメント