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