用于创建二维数组的语法


437

考虑:

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

这是如何创建具有5行10列的二维数组吗?

我在网上看到了这段代码,但是语法没有意义。


是的,还可以在第一条语句中将二维数组定义为具有10列。int [] [] multD =新的int [5] [10];
committedandroider

Answers:


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( “ row:” + i +“ column:” + j +“ value:” + multi [i] [j]); }
JavaTec

1
我们是否需要使用new int[][]=new int[][]{...}变种?我们可以写={...}吗?
纳瓦兹

2
@Nawaz不,数组是Java中的对象,并且仅通过使用new关键字将内存分配给对象。
roottraveller

1
@Oldrinb int array[][] = new int[3][];VS呢int array[][] = new int[][3];?哪一个是合法的,因为我已经在某处阅读了两个版本。
roottraveller

77

我们可以声明一个二维数组,并在声明时将元素直接存储为:

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

这里的int表示存储在数组中的整数类型元素,并且数组名称为'marks'。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结束。创建二维数组的另一种方法是先声明该数组,然后使用new运算符为其分配内存。

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

通过结合以上两个,我们可以编写:

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

我认为这是输入数据最简便的方法。
thanos.a

51

您可以按照其他人提到的方式创建它们。还有一点要补充:您甚至可以为每行创建一个倾斜的二维数组,不一定具有相同数量的列,如下所示:

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

5
说得好!这是进行独立初始化的最重要方面。
Ahamed

@Victor int array[][] = new int[3][];VS呢int array[][] = new int[][3];?哪一个是合法的,因为我已经在某处阅读了两个版本。
roottraveller

30

创建具有510列的二维数组的最常见惯用法是:

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数组的每个元素。
Armand 2014年

3
除非您null为任何非原语安全地处理情况。是否应该初始化每个元素完全取决于您的设计。同样,为了澄清-如果您未分配原语,则原语不能为null并实例化为已定义的默认值。例如an int不能为null,当您说不int i;分配值时,将使用默认值之一0在这里阅读有关内容
2014年

进一步说明,默认值仅分发给类/实例变量。使用前必须手动初始化局部变量(内部方法)。
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中,可以将二维数组声明为与一维数组相同。在一维数组中,您可以像

  int array[] = new int[5];

其中int是数据类型,array []是一个数组声明,并且new array是一个带有五个索引的对象的数组。

这样,您可以编写如下的二维数组。

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

array是一个int数据类型。我首先在这种类型的一维数组上声明了,然后创建了一个3行4列的数组。

在你的代码中

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

表示您已经创建了一个包含五行的二维数组。第一行有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
这对于不支持2D数组(如C)的语言很有用!
Alaa 2014年

3
C也支持多维数组。
里卡多·克鲁兹


3

这些类型的数组在Java中称为锯齿数组:

int[][] multD = new int[3][];
multD[0] = new int[3];
multD[1] = new int[2];
multD[2] = new int[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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.