【Java入門】2次元(多次元)配列の使い方(宣言、初期化)

こんにちは!フリーランスの長野です。

2次元配列って使っていますか?そもそも、配列では同じ型の複数の値をまとめて1つのかたまりとして扱うことができます。

1次元配列(1列の配列)を2つ以上まとめた配列が2次元配列になります。また、2次元配列を2つ以上まとめた配列が3次元配列となります。一般的に2次元以上の配列を多次元配列と呼んでいます。

この記事では、2次元配列や多次元配列について

  • 2次元配列の使い方
  • 多次元配列の使い方
  • 多次元配列の長さ
  • ArrayListで二次元配列を宣言する方法

など基本的な内容から応用的な内容についても解説していきます。

今回は2次元配列や多次元配列について、使い方をわかりやすく解説します!

2次元配列の使い方

2次元配列を宣言する方法、初期化する方法、要素にアクセスする方法について見ていきましょう。

宣言

2次元配列を宣言する方法にはいくつかのパターンがあります。

型名[][] 配列名;
配列名 = new 型名[1次元配列の数][];
配列名[0] = new 型名[1次元配列0の要素数];
配列名[1] = new 型名[1次元配列1の要素数];
・・・・ = ・・・・

2次元配列の宣言ですので、配列をあらわす「[ ]」記号を2つ並べます。

また、1次元配列0の要素数と1次元配列1の要素数のように、それぞれの1次元配列の要素数は同じ数値でなくても構いません。

それぞれの1次元配列の要素数を変えたい場合はこのように宣言します。

パターンの1行目と2行目をまとめて次のように記述してもかまいません。

型名[][] 配列名 = new 型名[1次元配列の数][];
配列名[0] = new 型名[1次元配列0の要素数];
配列名[1] = new 型名[1次元配列1の要素数];
・・・・ = ・・・・

1次元配列の要素数が同じ場合は次のように記述することもできます。

型名[][] 配列名 = new 型名[1次元配列の数][1次元配列内の要素数];

宣言と同時に初期化する方法

また、宣言時にあわせて初期化することもできます。

次のように記述します。

型名[][] 配列名 = {{値11, 値12, ・・・}, {値22, 値22, ・・・}, ・・・};

サンプルコードで確認しましょう。

import java.util.Arrays;

public class Main {
    
    public static void main(String args[]) {
        char[][] arr = {{'a', 'b', 'c'}, 
                        {'a', 'b', 'c', 'd'}, 
                        {'a', 'b', 'c', 'd', 'e'}};
        
        System.out.println(Arrays.deepToString(arr));
    }
}

実行結果:

[[a, b, c], [a, b, c, d], [a, b, c, d, e]]

このサンプルコードでは、2次元配列の宣言と同時に初期化しています。

なお、ArraysクラスのdeepToStringメソッドを使うとprintlnメソッドで多次元配列を出力表示することができるので便利です。

配列の各要素にアクセスして初期化する方法

配列の各要素にアクセスするためには「[ ]」記号内にそれぞれのインデックス番号を指定します。

以下のように記述して値を代入します。

配列名[1次元配列のインデックス番号][1次元配列内の要素の番号] = 値;

for文を使って要素にアクセスします。

サンプルコードで確認しましょう。

import java.util.Arrays;

public class Main {
    
    public static void main(String args[]) {
        // 1次元配列の数
        int num = 3; 
        // 各1次元配列の要素数を格納した配列
        int[] nums = {3, 4, 5};
        
        // 2次元配列の宣言
        char[][] arr = new char[num][];
        for(int i = 0; i < num; i++) {
            arr[i] = new char[nums[i]];
        }
        
        // 要素の代入
        for(int i = 0; i < num; i++) {
            for(int j = 0; j < nums[i]; j++) {
                arr[i][j] = (char)('a' + j);
            }
        }
        
        System.out.println(Arrays.deepToString(arr));
    }
}

実行結果:

[[a, b, c], [a, b, c, d], [a, b, c, d, e]]

このサンプルコードでは、char型の2次元配列を宣言し、for文を使って各要素にアクセスして初期化しています。

多次元配列の使い方

多次元配列の使い方についてみていきましょう。

基本的に2次元配列の場合と考え方は同じです。次元数にあわせて「[ ]」記号の数が変わるだけです。

説明をわかりやすくするために3次元の配列で、3次元の要素数が2、2次元の要素数が3、1次元の要素数が4の多次元配列について説明します。

宣言

配列の宣言は以下のようになります。

型名[][][] 配列名 = new 型名[2][3][4];

宣言と同時に初期化する方法

宣言と同時に初期化する場合、以下のサンプルコードのようになります。

import java.util.Arrays;

public class Main {
    
    public static void main(String args[]) {
        char[][][] arr = {{{'a', 'b', 'c', 'd'}, {'a', 'b', 'c', 'd'}, {'a', 'b', 'c', 'd'}}, 
                            {{'a', 'b', 'c', 'd'}, {'a', 'b', 'c', 'd'}, {'a', 'b', 'c', 'd'}}};
        
        System.out.println(Arrays.deepToString(arr));
    }
}

実行結果:

[[[a, b, c, d], [a, b, c, d], [a, b, c, d]], [[a, b, c, d], [a, b, c, d], [a, b, c, d]]]

配列の各要素にアクセスして初期化する方法

配列の各要素にアクセスして初期化する場合、以下のサンプルコードのようになります。

import java.util.Arrays;

public class Main {
    
    public static void main(String args[]) {
        // 3次元配列の宣言
        char[][][] arr = new char[2][3][4];
        
        // 要素の代入
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 3; j++) {
                for(int k = 0; k < 4; k++) {
                    arr[i][j][k] = (char)('a' + k);
                }
            }
        }
        
        System.out.println(Arrays.deepToString(arr));
    }
}

実行結果:

[[[a, b, c, d], [a, b, c, d], [a, b, c, d]], [[a, b, c, d], [a, b, c, d], [a, b, c, d]]]

多次元配列の長さ

多次元配列の長さ(要素数)を取得するには、lengthメソッドを使います。

以下のように記述します。

配列名[インデックス番号].length

サンプルコードで確認しましょう。

import java.util.Arrays;

public class Main {
    
    public static void main(String args[]) {
        // 3次元配列の宣言
        char[][][] arr = new char[2][3][4];
        
        // 要素の代入
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 3; j++) {
                for(int k = 0; k < 4; k++) {
                    arr[i][j][k] = (char)('a' + k);
                }
            }
        }
        
        System.out.println(Arrays.deepToString(arr));
        
        System.out.println("3次元の配列長さ:" + arr.length);
        System.out.println("2次元の配列長さ:" + arr[0].length);
        System.out.println("1次元の配列長さ:" + arr[0][0].length);
    }
}

実行結果:

[[[a, b, c, d], [a, b, c, d], [a, b, c, d]], [[a, b, c, d], [a, b, c, d], [a, b, c, d]]]
3次元の配列長さ:2
2次元の配列長さ:3
1次元の配列長さ:4

このサンプルコードでは、lengthメソッドを使って各次元の配列長さを取得しています。

3次元配列arrでは、arrもarr[0]もarr[0][0]も配列ですのでlengthメソッドを呼び出して配列長さを取得することができます。

ただし、arr[0][0][0]は配列ではなくchar型の変数になります。

ArrayListで二次元配列を宣言する方法

JavaではArrayListクラスでも配列を扱うことができます。

ArrayListクラスで二次元配列を宣言するには以下のように記述します。

ArrayList<ArrayList<型のラッパークラス名>> 配列名;

ArrayListクラスで二次元配列を宣言する方法については、こちらでも解説していますのでぜひ参考にしてください。

【Java入門】配列とListの変換(宣言の違いや2次元Listも解説)
更新日 : 2017年8月24日

addで要素を追加する方法

ArrayListクラスではaddメソッドを使って、要素の初期化や追加を行います。

サンプルコードで確認しましょう。

import java.util.ArrayList;

public class Main {
    
    public static void main(String args[]) {
        // 2次元配列の宣言
        ArrayList<ArrayList<Character>> arrays = new ArrayList<ArrayList<Character>>();
        
        for(int i = 0; i < 3; i++) {
            ArrayList<Character> array = new ArrayList<>();
            for(int j = 0; j < 4; j++) {
                array.add((char)('a' + j));
            }
            arrays.add(array);
        }
        
        
        System.out.println(arrays);
    }
}

実行結果:

[[a, b, c, d], [a, b, c, d], [a, b, c, d]]

このサンプルコードでは、addメソッドを使って要素の初期化を行っています。

addメソッドの引数にはchar型の値やchar型の値を要素とするArrayListオブジェクトを指定して、要素を追加しています。

ArrayListクラスのaddメソッドについては、こちらで詳しく解説していますので、ぜひ参考にしてください。

【3分でわかるJavaの基礎】Listにデータを追加する方法(add,addAll)
更新日 : 2017年6月7日

まとめ

ここでは、2次元配列や多次元配列について説明しました。

2次元配列の宣言や初期化が理解できれば、3次元以上の多次元配列も2次元配列と同じ考え方で扱うことができます。また、ArrayListクラスを使ってList型の多次元配列を扱う方法についても説明しました。

多次元配列は使う機会も多いと思いますので使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]