2次元配列を作成するための構文


437

検討してください:

int[][] multD = new int[5][];
multD[0] = new int[10];

これは、5行10列の2次元配列を作成する方法ですか?

このコードをオンラインで見ましたが、構文は意味がありませんでした。


また、2番目の配列を最初のステートメントで10列として定義することもできます。int [] [] multD = new int [5] [10];
committedandroider

回答:


814

以下を試してください:

int[][] multi = new int[5][10];

...これは次のようなものの短い手です:

int[][] multi = new int[5][];
multi[0] = new int[10];
multi[1] = new int[10];
multi[2] = new int[10];
multi[3] = new int[10];
multi[4] = new int[10];

すべての要素は、のデフォルト値に初期化されることに注意してくださいint0上記も同等であるので、:

int[][] multi = new int[][]{
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

27
楽しい部分は、さまざまな行にさまざまな列を配置できることです。例:-int [] [] multi = new int [5] []; multi [0] =新しいint [10]; multi [1] = new int [6]; multi [2] = new int [9]も完全に有効
JavaTec

2
こんにちはMuneeb、私が正しく理解していれば、各行に異なる列サイズの多次元配列で値を割り当てる方法を尋ねています。方法は次のとおりです。int[] [] multi = new int [] [] {{1,2,3}、{1,2,3,4}、{1}}; そして、次のようにそれらにアクセス/印刷できます:for(int i = 0; i <multi.length; i ++){for(int j = 0; j <multi [i] .length; j ++){System.out.println( "行:" + i + "列:" + j + "値:" + multi [i] [j]); }}
JavaTec

1
私たちが使用する必要がありますnew int[][]=new int[][]{...}変?書け={...}ますか?
Nawaz

2
@Nawazいいえ、配列はJavaではオブジェクトであり、メモリはnewキーワードを使用することによってのみオブジェクトに割り当てられます。
roottraveller 2017年

1
@Oldrinb int array[][] = new int[3][];VSはどうint array[][] = new int[][3];ですか?私はどこかで両方のバージョンを読んだので、どちらが合法か。
roottraveller 2017年

77

2次元配列を宣言し、宣言時に要素を次のように直接格納できます。

int marks[][]={{50,60,55,67,70},{62,65,70,70,81},{72,66,77,80,69}};

ここで、intは配列に格納された整数型の要素を表し、配列名は「マーク」です。配列は同じデータ型の要素のコレクションであるため、intは、「{」および「}」の中括弧内に表されるすべての要素のデータ型です。

上記のステートメントに戻ります。要素の各行は中括弧内に記述する必要があります。行と各行の要素はコンマで区切る必要があります。

ここで、ステートメントを確認します。行が3つ、列が5つあるため、JVMは3 * 5 = 15ブロックのメモリを作成します。これらのブロックは、次のように個別に参照できます。

marks[0][0]  marks[0][1]  marks[0][2]  marks[0][3]  marks[0][4]
marks[1][0]  marks[1][1]  marks[1][2]  marks[1][3]  marks[1][4]
marks[2][0]  marks[2][1]  marks[2][2]  marks[2][3]  marks[2][4]


注:n個の要素
を格納する場合、配列のインデックスはゼロから始まり、n-1で終わります。2次元配列を作成する別の方法は、最初に配列を宣言してから、new演算子を使用してその配列にメモリを割り当てることです。

int marks[][];           // declare marks array
marks = new int[3][5];   // allocate memory for storing 15 elements

上記の2つを組み合わせると、次のように記述できます。

int marks[][] = new int[3][5];

これがデータを入力する最も簡単な方法だと思います。
thanos.a

51

他の人が言及したのと同じ方法で作成できます。追加するもう1つのポイント:次のように、列の数が同じである必要はなく、各行で歪んだ2次元配列を作成することもできます。

int array[][] = new int[3][];
array[0] = new int[3];
array[1] = new int[2];
array[2] = new int[5];

5
よく言った!これは、独立した初期化を持つ最も重要な側面です。
Ahamed

@ビクターint array[][] = new int[3][];VSはどうint array[][] = new int[][3];ですか?私はどこかで両方のバージョンを読んだので、どちらが合法か。
roottraveller 2017年

30

510列の2次元配列を作成する最も一般的なイディオムは次のとおりです。

int[][] multD = new int[5][10];

別の方法として、各行を明示的に初期化する必要がありますが、次のものを使用することもできます。

int[][] multD = new int[5][];
for (int i = 0; i < 5; i++) {
  multD[i] = new int[10];
}

3
また、プリミティブのみが初期化を必要としないことも理解してください。このように配列を宣言するObject[][] ary2d = new Object[5][10];場合でも、2D配列の各要素を初期化する必要があります。
アルマンド2014年

3
null非プリミティブについてケースを安全に処理しない限り。各要素を初期化する必要があるかどうかは、設計に完全に依存します。また、明確にするために、プリミティブをnullにすることはできません。また、プリミティブが割り当てられていない場合、定義済みのデフォルト値にインスタンス化されます。たとえば、intnullをnullにすることはできません。int i;値を割り当てずに発声すると、デフォルトの値0が使用されます。それについてここで読んでください
不可分

さらに明確にすると、デフォルト値はクラス/インスタンス変数にのみ渡されます。ローカル変数(メソッド内)は、使用する前に手動で初期化する必要があります。
2014年

12

次のように宣言することもできます。それは良いデザインではありませんが、動作します。

int[] twoDimIntArray[] = new int[5][10];

9

試してください:

int[][] multD = new int[5][10];

コードでは、2D配列の最初の行だけが0に初期化されることに注意してください。2行目から5行目までは存在していません。あなたがそれらを印刷しようとすると、あなたはnull彼ら全員のために得るでしょう。


8
int [][] twoDim = new int [5][5];

int a = (twoDim.length);//5
int b = (twoDim[0].length);//5

for(int i = 0; i < a; i++){ // 1 2 3 4 5
    for(int j = 0; j <b; j++) { // 1 2 3 4 5
        int x = (i+1)*(j+1);
        twoDim[i][j] = x;
        if (x<10) {
            System.out.print(" " + x + " ");
        } else {
            System.out.print(x + " ");
        }
    }//end of for J
    System.out.println();
}//end of for i

8

Javaでは、2次元配列を1次元配列と同じように宣言できます。一次元配列では、次のように書くことができます

  int array[] = new int[5];

ここで、intはデータ型、array []は配列宣言、new array5つのインデックスを持つオブジェクトを持つ配列です。

そのように、2次元配列は次のように書くことができます。

  int array[][];
  array = new int[3][4];

これarrayはintデータ型です。最初にその型の1次元配列を宣言し、次に3行4列の配列を作成します。

あなたのコードで

int[][] multD = new int[5][];
multD[0] = new int[10];

5行の2次元配列を作成したことを意味します。最初の行には10列があります。Javaでは、必要に応じてすべての行の列サイズを選択できます。


7
int rows = 5;
int cols = 10;

int[] multD = new int[rows * cols];

for (int r = 0; r < rows; r++)
{
  for (int c = 0; c < cols; c++)
  {
     int index = r * cols + c;
     multD[index] = index * 2;
  }
}

楽しい!


1
これは、Cのような2D配列をサポートしていない言語で役立ちます。
Alaa

3
Cも多次元配列をサポートしています。
Ricardo Cruz、2015年


3

これらのタイプの配列は、Javaではジャグ配列と呼ばれます。

int[][] multD = new int[3][];
multD[0] = new int[3];
multD[1] = new int[2];
multD[2] = new int[5];

このシナリオでは、配列の各行は異なる数の列を保持します。上記の例では、最初の行は3つの列を保持し、2番目の行は2つの列を保持し、3番目の行は5つの列を保持します。以下のように、コンパイル時にこの配列を初期化できます。

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

配列内のすべての要素を簡単に反復できます。

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

0

実際、Javaには数学的な意味での多次元配列はありません。Javaが持っているのは、配列の配列であり、各要素は配列でもある配列です。そのため、初期化するための絶対要件は最初の次元のサイズです。残りを指定すると、デフォルト値が入力された配列が作成されます。

int[][]   ar  = new int[2][];
int[][][] ar  = new int[2][][];
int[][]   ar  = new int[2][2]; // 2x2 array with zeros

それはまた、私たちに癖を与えます。要素を追加してサブ配列のサイズを変更することはできませんが、任意のサイズの新しい配列を割り当てることで変更できます。

int[][]   ar  = new int[2][2];
ar[1][3] = 10; // index out of bound
ar[1]    = new int[] {1,2,3,4,5,6}; // works
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.