Java Technology

[Java] 二重ループと多次元配列の組み合わせ

2021-01-01

あるプログラムで、変数に[][]が重なってたり、for文にfor文が重なってたり、ちんぷんかんぷんだった。

最初は別々に調べて整理していた。

  • [][]の重なり→二次元配列の宣言
  • for文にfor文が重なる形→for文のネスト構造

しかしもっと調べてみると、実はこの二つの概念はペアで使われることが多いということがわかった。

なので今回は組み合わせで整理する。


そもそも二次元配列とfor文のネスト構造とは?

こちら二つの内容については、別途別の記事で整理した。

二次元配列について


for文のネスト構造について


ペアで使うメリット

ではこの二つで何ができるのか?

多次元配列でデータを入れた時、for文のネスト構造で多次元配列の全ての要素にいっぺんにアクセスできる。


組み合わせのプログラムの例

例として、九九の計算結果を出してみる。

public class Main{
    public static void main(String[] args){
        int[][] timesTable = new int[9][9];
        
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                timesTable[i][j] = (i + 1) * (j + 1);
            }
        }
        
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(timesTable[i][j] + "\t" );
            }
            System.out.println();
        }
        
    }
}
//出力結果
1	2	3	4	5	6	7	8	9	
2	4	6	8	10	12	14	16	18	
3	6	9	12	15	18	21	24	27	
4	8	12	16	20	24	28	32	36	
5	10	15	20	25	30	35	40	45	
6	12	18	24	30	36	42	48	54	
7	14	21	28	35	42	49	56	63	
8	16	24	32	40	48	56	64	72	
9	18	27	36	45	54	63	72	81	


どういう風に実行されているのか

順にどのように実行されていくかを見ていく。


二次元配列の実行

二次元配列を宣言し、timesTableという変数に入れる。

int[][] timesTable = new int[9][9];


すると、こんな箱ができる。



入れ子にしたforで順番に計算

timesTable[ ][ ]の箱ができた。

順番に計算して、結果をtimesTable[i][j]に格納していく。

for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                timesTable[i][j] = (i + 1) * (j + 1);
            }
        }


(i + 1) * (j + 1)となっているのは、for文の結果は0から始まるから。

九九での最初は1 × 1で始まる。けれども、for文では最初の数字は0で設定している。

なのでどちらも+1することで、数字を合わせている。

[i]が縦、[j]が横列だと思ってもらうと良い。

[i]の1回目の処理:

  • [ i ] が 0 で [ j ]が 0→ (0 + 1) * (0 + 1) = 1
  • [ i ] が 0 で [ j ]が 1→ (0 + 1) * (0 + 2) = 2
  • [ i ] が 0 で [ j ]が 2→ (0 + 1) * (0 + 3) = 3

というように続く。

すると、以下のように、数字が格納される。



[ j ]の処理が終わり、[ i ] の処理が1回終わると、今度は [i] の2回目の処理が始まる。

[i]の2回目の処理:

  • [ i ] が 1 で [ j ]が 0→ (1 + 1) * (0 + 1) = 2
  • [ i ] が 1 で [ j ]が 1→ (1 + 1) * (0 + 2) = 4
  • [ i ] が 1 で [ j ]が 2→ (1 + 1) * (0 + 3) = 6

というように、[j]の処理が終わるまで続く。

すると、以下のように数字が格納される。




これが続いていき、[i]の処理が9回続くまで処理が続く。


出力も同じ流れ

同じような処理の流れで、出力も行う。

 for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(timesTable[i][j] + "\t" );
            }
            System.out.println();
        }


格納した81個の値を、for文のネスト構造でいっぺんにアクセスできる。

-Java, Technology