基本型の多次元配列

みるくあいらんどっ! > ドキュメント > Java > じっくり学ぶ Java講座 [初心者向け・入門]


基本型の二次配列

多次元配列の一番シンプルな形が二次配列なので、二次配列について説明していきます。以下に仕様を定めます。

  • 以下の表を表示する。
  • 年ごとの合計を出力する。
  • 総計を出力する。
  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

以下の点に注意してください。

  • 今回使用した二次配列は int[][]型インスタンスである。
  • その要素 0~2は(基本型ではなく)参照型で、int[]型インスタンスへの参照となっている。
  • int[][]型インスタンスが 1個、int[]型インスタンスが 3個生成されている(インスタンスの生成には、予約語newを使用している)。
  • 二次配列とは言うものの、実態は一次配列と一次配列への参照という組み合わせである。
  • 22行目のearnings.lengthは、「変数 earningsが参照する int[][]型インスタンスの配列の大きさ」(今回は 3)を表している。
  • 25行目の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型インスタンスの記述を省略しています。

二次配列の宣言

多次元配列

三次元配列以上の配列も同様の形態です。基本型の場合、一次部分に実際の値を格納する箱が存在し、二次以上の部分は下位への参照となっています。

最終更新: 2013/02/10 , 公開: 2013/02/10
▲top