1. 概要

Javaの多次元配列は、さまざまなサイズの配列を要素として含む配列です。 「配列の配列」または「不規則な配列」または「ギザギザの配列」とも呼ばれます。

このクイックチュートリアルでは、多次元配列の定義と操作についてさらに詳しく見ていきます。

2. 多次元配列の作成

多次元配列を作成する方法を見てみましょう。

2.1. 速記形式

多次元配列を定義する簡単な方法は次のとおりです。

int[][] multiDimensionalArr = {{1, 2}, {3, 4, 5}, {6, 7, 8, 9}};

ここでは、multiDimensionalArrを1つのステップで宣言して初期化しました。

2.2. 宣言してから初期化

サイズ3の多次元配列を宣言することから始めます。

int[][] multiDimensionalArr = new int[3][];

ここでは、変動するため、2番目の次元の指定を省略しました

次に、multiDimensionalArr内のそれぞれの要素を宣言して初期化することでさらに進んでみましょう。

multiDimensionalArr[0] = new int[] {1, 2};
multiDimensionalArr[1] = new int[] {3, 4, 5};
multiDimensionalArr[2] = new int[] {6, 7, 8, 9};

要素を初期化せずに単純に宣言することもできます。

multiDimensionalArr[0] = new int[2];
multiDimensionalArr[1] = new int[3];
multiDimensionalArr[2] = new int[4];

これらは、たとえばユーザー入力を使用して、後で初期化できます。

java.util.Arrays.fill メソッドを使用して、配列要素を初期化することもできます。

void initialize2DArray(int[][] multiDimensionalArray) {
    for (int[] array : multiDimensionalArray) {
        Arrays.fill(array, 7);
    }
}

配列内のすべての要素は同じ値で初期化されます。

3. 記憶表現

multiDimensionalArr のメモリ表現はどのようになりますか?

ご存知のように、Javaの配列はオブジェクトに他ならず、その要素はプリミティブまたは参照のいずれかです。 したがって、Javaの2次元配列は、1次元配列の配列と考えることができます。

メモリ内のmultiDimensionalArrは、次のようになります。

明らかに、 multiDimensionalArr [0] は、サイズ2の1次元配列への参照を保持しています。 multiDimensionalArr [1] は、別の1次元への参照を保持しています。サイズ3などの配列。

このようにして、Javaは多次元配列を定義して使用することを可能にします。

4. 要素の反復

Javaの他の配列と同じように、多次元配列を繰り返すことができます。

ユーザー入力を使用して、multiDimensionalArr要素の反復と初期化を試してみましょう。

void initializeElements(int[][] multiDimensionalArr) {
    Scanner sc = new Scanner(System.in);
    for (int outer = 0; outer < multiDimensionalArr.length; outer++) {
        for (int inner = 0; inner < multiDimensionalArr[outer].length; inner++) {
            multiDimensionalArr[outer][inner] = sc.nextInt();
        }
    }
}

ここで、 multiDimensionalArr [outer] .length は、multiDimensionalArrのインデックスouterにある配列の長さです。

各サブ配列の有効な範囲内でのみ要素を検索することを保証し、ArrayIndexOutOfBoundExceptionを回避するのに役立ちます。

5. 印刷要素

多次元配列の要素を印刷したい場合はどうなりますか?

明らかな方法の1つは、すでに説明した反復ロジックを使用することです。 これには、それ自体が配列である多次元配列内の各アイテムを反復処理してから、その子配列を一度に1つの要素で反復処理することが含まれます。

もう1つのオプションは、 java.util.Arrays.toString()ヘルパーメソッドを使用することです。

void printElements(int[][] multiDimensionalArr) {
    for (int index = 0; index < multiDimensionalArr.length; index++) {
        System.out.println(Arrays.toString(multiDimensionalArr[index]));
    }
}

そして、最終的にはクリーンでシンプルなコードになります。 生成されたコンソール出力は次のようになります。

[1, 2] [3, 4, 5] [6, 7, 8, 9]

6. 要素の長さ

メイン配列を反復処理することにより、多次元配列内の配列の長さを見つけることができます。

int[] findLengthOfElements(int[][] multiDimensionalArray) {
    int[] arrayOfLengths = new int[multiDimensionalArray.length];
    for (int i = 0; i < multiDimensionalArray.length; i++) {
        arrayOfLengths[i] = multiDimensionalArray[i].length;
    }
    return arrayOfLengths;
}

Javaストリームを使用して配列の長さを見つけることもできます。

Integer[] findLengthOfArrays(int[][] multiDimensionalArray) {
    return Arrays.stream(multiDimensionalArray)
      .map(array -> array.length)
      .toArray(Integer[]::new);
}

7. 2次元配列をコピーする

Arrays.copyOf メソッドを使用して、2次元配列をコピーできます。

int[][] copy2DArray(int[][] arrayOfArrays) {
    int[][] copied2DArray = new int[arrayOfArrays.length][];
    for (int i = 0; i < arrayOfArrays.length; i++) {
        int[] array = arrayOfArrays[i];
        copied2DArray[i] = Arrays.copyOf(array, array.length);
    }
    return copied2DArray;
}

これは、Javaストリームを使用して実現することもできます。

Integer[][] copy2DArray(Integer[][] arrayOfArrays) {
    return Arrays.stream(arrayOfArrays)
      .map(array -> Arrays.copyOf(array, array.length))
      .toArray(Integer[][]::new);
}

8. 結論

この記事では、多次元配列とは何か、それらがメモリ内でどのように見えるか、およびそれらを定義して使用する方法について説明しました。

いつものように、提示された例のソースコードは、GitHubにあります。