【问题标题】:Can I create a multidimensional array using single arrays to fill?我可以使用单个数组来填充创建多维数组吗?
【发布时间】:2019-04-13 05:27:52
【问题描述】:

假设我有两个随机生成的数组(行和列),我希望它们用于填充多维数组。由于数组是行和列,多维数组将是 matrix[rows][columns]。只是我如何生成行的一个例子:

int[] rows = new int[20];         
for(int i = 0; i < rows.length; i++) {
rows[i] = (int)(Math.random()*1000 + 1);
    }
System.out.println("Rows Generated: " + Arrays.toString(randomArrayN));
  }
}

columns 数组也是以这种方式构建的。有没有一种简单的方法来创建一个二维数组并使用这些数组来填充它们? 我知道这种语法是错误的,但基本上我想知道是否有办法做到这一点:

int matrix[][] = new int[rows][columns];

【问题讨论】:

  • 第一个 sn-p 中的 randomArrayN 是什么?
  • 如何从您的行和列数组中准确地填充矩阵?考虑到您将有 n 行和 m 列,您有 n + m 值,但矩阵大小为 n * m。
  • 如果你尝试将行和列同时添加到二维数组中,会导致很多冲突......所以这取决于你想如何将多维数组构造为@格莱恩斯指出
  • 哎呀,不要介意 randomArrayN,它应该是行。我已将数组的名称从那个更改为行。至于@Glains,现实情况可能是在二维数组中创建行和列的值比尝试用已经制作的数组填充它更简单,那么?
  • 如上所述,假设您有rows = {1, 2, 3}columns = {3, 4, 6}。如果你得到matrix = [rows.length][columns.length],你只有 6 个值,但矩阵的大小为 3 * 3 = 9。您想如何计算行和列的值?

标签: java arrays multidimensional-array


【解决方案1】:

是的,你绝对可以,虽然它可能有点令人困惑。

你可以用这个来初始化 3d 数组:

// test is a 3d array
int[][][] test = {
          {
           {1, -2, 3}, 
           {2, 3, 4}
          }, 
          { 
           {-4, -5, 6, 9}, 
           {1}, 
           {2, 3}
          } 
};

我喜欢用术语或 3d 对象来思考这个问题,比如正则棱镜。棱镜上的每一行(高度)都有 2 个长度和宽度,或 x、y。在其他世界中,您有一个 2d 数组,一个值是列,另一个是行,在一个数组中使其成为 3d。

现在如果你想打印出 3d 数组的值怎么办? 只需这样做:

 for (int[][] array2D: test) {
    for (int[] array1D: array2D) {
       for(int item: array1D) {
          System.out.println(item);
       }
    }
 }

【讨论】:

    【解决方案2】:

    虽然从行和列的角度来考虑二维数组很方便,但二维数组只是数组的数组。

    例如,

        int[] values1 = {1, 2 ,3};
        int[][] matrix1 = {values1, values1, values1};
    
        matrix1[1][1] = 42;
        System.out.println(matrix1[0][1]);
        System.out.println(matrix1[1][1]);
        System.out.println(matrix1[2][1]);
    

        int[] values2 = {1, 2 ,3};
        int[][] matrix2 = new int[3][3];
        matrix2[0] = values2;
        matrix2[1] = values2;
        matrix2[2] = values2;
    
        matrix2[1][1] = 42;
        System.out.println(matrix2[0][1]);
        System.out.println(matrix2[1][1]);
        System.out.println(matrix2[2][1]);
    

    请注意,在这两种情况下,都会多次使用 values 数组来初始化矩阵的每个 。因此,对任何矩阵元素的任何更改都会反映在其他 rows 中(因为每个 row 实际上是同一个数组)。在某些情况下,这可能很有用。如果元素需要独立,则使用以下内容:

        int[] values3 = {1, 2 ,3};
        int[][] matrix3 = new int[3][3];
        System.arraycopy(values3, 0, matrix3[0], 0, values3.length);
        System.arraycopy(values3, 0, matrix3[1], 0, values3.length);
        System.arraycopy(values3, 0, matrix3[2], 0, values3.length);
    
        matrix3[1][1] = 42;
        System.out.println(matrix3[0][1]);
        System.out.println(matrix3[1][1]);
        System.out.println(matrix3[2][1]);
    

    矩阵的每一都使用相同值的副本进行初始化,但对任何元素的更改独立于任何其他元素(因为它是不同的数组)。

    如果矩阵需要逐个元素地初始化,请参见other question

    【讨论】:

      【解决方案3】:

      如果您需要一个用随机整数填充的二维数组,您可以使用类似于上面生成行的嵌套循环:

      public static void main(String[] args) {
          int matrix[][] = new int[20][20];
          for(int i = 0; i < matrix.length; i++){
              for(int j = 0; j < matrix[i].length; j++){
                  matrix[i][j] = (int)(Math.random()*1000 + 1);
              }
          }
      
          for(int[] row : matrix){
              System.out.println(Arrays.toString(row));
          }        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2017-03-22
        • 2019-10-28
        • 1970-01-01
        • 2011-01-11
        相关资源
        最近更新 更多