【问题标题】:Syntax for creating a two-dimensional array in Java在 Java 中创建二维数组的语法
【发布时间】:2012-08-27 05:20:18
【问题描述】:

考虑:

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

这就是你创建一个 5 行 10 列的二维数组的方式吗?

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

【问题讨论】:

  • 是的,也可以在第一条语句中将二维数组定义为 10 列。 int[][] multD = new int[5][10];

标签: java multidimensional-array


【解决方案1】:

尝试以下方法:

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 }
};

【讨论】:

  • 有趣的部分是你也可以在不同的行中有不同的列。例如:- int[][] multi = new int[5][];多 [0] = 新的整数 [10];多 [1] = 新的整数 [6]; multi[2] = new int[9] 也完全有效
  • 嗨 Muneeb,如果我理解正确,您是在问一个多维数组,每行的列大小不同,如何分配值。方法如下: int[][] multi = new int[][]{{1,2,3},{1,2,3,4},{1}};您可以像这样访问/打印它们: for(int i=0; i
  • 我们是否需要在=new int[][]{...} 变体中使用new int[][]?我们可以写={...}吗?
  • @Nawaz 不,数组是 java 中的对象,内存仅通过使用 new 关键字分配给对象。
  • @Oldrinb int array[][] = new int[3][]; VS int array[][] = new int[][3]; 呢?哪一个是合法的,因为我在某处读过这两个版本。
【解决方案2】:

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

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

【讨论】:

  • 我认为这是最简洁的数据输入方式。
【解决方案3】:

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

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

【讨论】:

  • 说得好!这是独立初始化最重要的方面。
  • @Victor int array[][] = new int[3][]; VS int array[][] = new int[][3]; 呢?哪一个是合法的,因为我在某处读过这两个版本。
【解决方案4】:

创建具有 5 行和 10 列的二维数组的最常见习惯用法是:

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

或者,您可以使用以下内容,这与您所拥有的更相似,但您需要显式初始化每一行:

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

【讨论】:

  • 也意识到只有原语不需要初始化。如果您将数组声明为Object[][] ary2d = new Object[5][10];,那么您仍然必须初始化二维数组的每个元素。
  • 除非您为任何非基元安全地处理 null 案例。是否应该初始化每个元素完全取决于您的设计。此外,只是为了澄清 - 如果您没有分配原语,则原语不能为空并被实例化为定义的默认值。例如。 int 不能为 null,当您说 int i; 而不分配值时,将使用默认的 0 之一。 Read about it here
  • 进一步澄清,默认值仅分发给类/实例变量。局部变量(内部方法)必须在使用前手动初始化。
【解决方案5】:

也可以通过以下方式声明。这不是好的设计,但它确实有效。

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

【讨论】:

    【解决方案6】:

    试试:

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

    请注意,在您的代码中,只有二维数组的第一行被初始化为 0。 第 2 到 5 行甚至都不存在。如果您尝试打印它们,每个人都会收到null

    【讨论】:

    • “第 2 到 5 行甚至都不存在”。为什么会这样?
    【解决方案7】:
    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 中,您可以根据需要为每一行选择列大小。

      【讨论】:

        【解决方案9】:
        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;
          }
        }
        

        享受吧!

        【讨论】:

        • 这在不支持像 C 这样的二维数组的语言中很有用!
        • C 也支持多维数组。
        【解决方案10】:

        试试这个方法:

        int a[][] = {{1,2}, {3,4}};
        
        int b[] = {1, 2, 3, 4};
        

        【讨论】:

          【解决方案11】:

          这些类型的数组在 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();
          }
          

          【讨论】:

            【解决方案12】:

            实际上,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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-01-08
              • 2013-11-22
              • 2012-12-06
              • 2021-03-16
              • 2013-11-22
              • 2011-02-12
              • 2017-09-28
              相关资源
              最近更新 更多