【问题标题】:Returning a 2d array from inputed 1d array从输入一维数组返回一个二维数组
【发布时间】:2021-03-16 03:49:10
【问题描述】:

我想将输入的一维数组1x6 返回到一个二维数组3x2。我想我已经弄明白了,但是在我的代码中,我一直需要这个错误数组,但是找到了int。我认为这是由于输入数组是一维数组而不是二维数组,但我不确定。谁能帮我解决这个问题?

例子:

int[] d = {4, 1, 20, 45, 2, 31};

返回一个二维数组3x2

输出:

4  1  
20 45  
2   31

错误:

transmo[j][i] = d[i][j];
array required, but int found

我的代码如下:

public class mypractice {
    public void a_three_by_two(int[] d) {
        int transmo[][] = new int[3][2];

        for (int i = 0; i < 1; i++) {
            for (int j = 0; j < 6; j++) {
                transmo[j][i] = d[i][j];
            }
        }

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

【问题讨论】:

    标签: java arrays loops for-loop


    【解决方案1】:

    您的第一组循环需要与第二组循环相同,否则transmo[i][j] 将失败。

    然后您需要计算索引为d

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            transmo[i][j] = d[i * 2 + j];
        }
    }
    

    【讨论】:

      【解决方案2】:

      迭代一维数组,然后使用模数和余数索引二维输出数组:

      public int[][] a_three_by_two(int[] d, int nrow, int ncol) {
          int transmo[][] = new int[nrow][ncol];
          
          for (int i=0; i < d.length; ++i) {
              int row = i / ncol;
              int col = i % ncol;
              transmo[row][col] = d[i];
          }
      
          return transmo;
      }
      
      int[] d = {4, 1, 20, 45, 2, 31};
      int[][] output = a_three_by_two(d, 2, 3);
      System.out.println(Arrays.deepToString(output));
      

      打印出来:

      [[4, 1], [20, 45], [2, 31]]
      

      这里的逻辑是,输入一维数组每两步,行索引加一,除以二后的余数,列索引加一。

      请注意,此版本的代码非常灵活,适用于任何维二维数组。

      【讨论】:

        【解决方案3】:

        由于 d[] 是一维数组,您应该使用 d[index] 访问它。这里需要解决的是tansmo的索引和d的索引的关系

        • i = 0 j = 0 => d[index] index = 0
        • i = 0 j = 1 => d[index] 索引 = 1
        • i = 1 j = 0 => d[index] index = 2
        • i = 1 j = 1 => d[index] index = 3
        • i = 2 j = 0 => d[index] index = 4
        • i = 2 j = 1 => d[index] index = 5
        • 2*i+j = 索引

        所以你的循环会是这样的:

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++){
                transmo[i][j] = d[2*i+j];
            }
        }
        

        【讨论】:

          【解决方案4】:

          您可以使用 streams 从一维数组创建和填充新的二维数组:

          int[] arr1d = {4, 1, 20, 45, 2, 31};
          
          // index of the element in the 1d array
          AtomicInteger i = new AtomicInteger(0);
          // create and populate a new 2d array '3x2'
          int[][] arr2d = IntStream.range(0, 3)
                  .mapToObj(row -> IntStream.range(0, 2)
                          // take the element from the 1d
                          // array and increment the index
                          .map(j -> arr1d[i.getAndIncrement()])
                          .toArray())
                  .toArray(int[][]::new);
          
          // output
          System.out.println(Arrays.deepToString(arr2d));
          // [[4, 1], [20, 45], [2, 31]]
          

          另见:How do I square a predefined array and print it in 3 integer spaces

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-07
            • 2011-07-23
            • 1970-01-01
            • 2022-12-10
            相关资源
            最近更新 更多