多次元配列の一番シンプルな形が二次配列なので、二次配列について説明していきます。以下に仕様を定めます。
1期 | 2期 | 3期 | 4期 | |
---|---|---|---|---|
1年目 | 100 | 140 | 200 | 150 |
2年目 | 130 | 120 | 150 | 200 |
3年目 | 110 | 170 | 160 | 180 |
この仕様を満たすソースコードは以下の通り。
J201/J201.java
/** * 二次配列を使用します。 */ public class J201 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // int[][]型インスタンスの生成、参照型変数 earningsの宣言と紐づけ int[][] earnings = new int[3][]; // int[]型インスタンスの生成と初期化 earnings[0] = new int[] { 100, 140, 200, 150}; earnings[1] = new int[] { 130, 120, 150, 200}; earnings[2] = new int[] { 110, 170, 160, 180}; // 総計 int sum = 0; for(int j = 0; j < earnings.length; j ++) { System.out.print((j + 1) + "年目: "); int sumYear = 0; for(int i = 0; i < earnings[j].length; i ++) { System.out.print(earnings[j][i] + " "); sumYear += earnings[j][i]; } System.out.println("合計: " + sumYear); sum += sumYear; } System.out.println("総計: " + sum); } }
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 160 180 合計: 620 総計: 1810
以下の点に注意してください。
earnings.length
は、「変数 earningsが参照する int[][]型インスタンスの配列の大きさ」(今回は 3)を表している。earnings[j].length
は、「変数 earningsが参照する int[][]型インスタンスの j番目(0~2番目)の要素の参照先にある int[]型インスタンスの配列の大きさ」(今回はいずれも 4)を表している。イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。
一次配列のときと同様に、参照型の宣言と同時に、配列インスタンスの初期化をする場合、予約 newを省略して記述することができます。
ソースコードは以下の通り。
J202/J202.java
/** * 二次配列を使用します(初期化します)。 */ public class J202 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // int[][]型インスタンス、int[]型インスタンスの生成と初期化 // 参照型変数 earningsの宣言と紐づけ int[][] earnings = { { 100, 140, 200, 150}, { 130, 120, 150, 200}, { 110, 170, 160, 180}, }; // 総計 int sum = 0; for(int j = 0; j < earnings.length; j ++) { System.out.print((j + 1) + "年目: "); int sumYear = 0; for(int i = 0; i < earnings[j].length; i ++) { System.out.print(earnings[j][i] + " "); sumYear += earnings[j][i]; } System.out.println("合計: " + sumYear); sum += sumYear; } System.out.println("総計: " + sum); } }
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 160 180 合計: 620 総計: 1810
最も注意する点は、予約語new
を 1回も使用していないにも関わらず、配列インスタンスは先のプログラムと同じく 4個作成されることです。また、16行目の最後のコンマ「,」は記述しなくても動作しますが、記述しておいたほうが見栄えも良く、今後、再び並び替えや追加を行う場合に便利です。
イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。
大きさの異なる二次配列も実現可能です。
1期 | 2期 | 3期 | 4期 | |
---|---|---|---|---|
1年目 | 100 | 140 | 200 | 150 |
2年目 | 130 | 120 | 150 | 200 |
3年目 | 110 | 170 |
この仕様を満たすソースコードは以下の通り。
J203/J203.java
/** * 大きさの異なる二次配列を使用します。 */ public class J203 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // int[][]型インスタンス、int[]型インスタンスの生成と初期化 // 参照型変数 earningsの宣言と紐づけ int[][] earnings = { { 100, 140, 200, 150}, { 130, 120, 150, 200}, { 110, 170}, }; // 総計 int sum = 0; for(int j = 0; j < earnings.length; j ++) { System.out.print((j + 1) + "年目: "); int sumYear = 0; for(int i = 0; i < earnings[j].length; i ++) { System.out.print(earnings[j][i] + " "); sumYear += earnings[j][i]; } System.out.println("合計: " + sumYear); sum += sumYear; } System.out.println("総計: " + sum); } }
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 合計: 280 総計: 1470
earnings[j].length
の値は、jが 0および 1のときには 4、jが 2のときには 2になることに注意してください。
イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。
値を指定せずに二次配列を宣言することができます。この形も予約語 newを少し省略した形となります。
ソースコードは以下の通り。
J204/J204.java
/** * 二次配列インスタンスを宣言します。 */ public class J204 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int[][] earnings = new int[3][4]; System.out.println("earningsの参照先の配列インスタンスの大きさは " + earnings.length); } }
実行結果は以下の通り。
earningsの参照先の配列インスタンスの大きさは 3
予約語 newは 1回しか使っていないにも関わらず、配列インスタンスは合計 4個作成されることに注意してください。また、int[][]型の各要素には int[]型配列インスタンスへの参照が設定され、int[]型の各要素は、int型のインスタンスフィールドであるため 0に初期化されます。
イメージとしては以下のような感じです。なお、String型インスタンスの記述を省略しています。
三次元配列以上の配列も同様の形態です。基本型の場合、一次部分に実際の値を格納する箱が存在し、二次以上の部分は下位への参照となっています。