Javaのギザギザ配列

Javaの多次元配列

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][];

ここでは、we’ve omitted to specify the second dimension since it will varyです。

次に、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は、次のようになります。

image

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

このようにして、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にある配列の長さです。

It helps us to ensure that we are looking for elements only within a valid range of each sub-array、それによって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. 結論

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

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