【问题标题】:Converting a 1D array to a 2D array将一维数组转换为二维数组
【发布时间】:2020-07-22 17:01:57
【问题描述】:

得到一个数组:

String[] array = song.split("");
[W, U, B, W, U, B, A, B, C, W, U, B]

我需要将它进行二维转换:

String[][] arr = new String[4][3];
[[W, U, B], [W, U, B], [A, B, C], [W, U, B]]

以下代码:

for (int i = 0; i < arr.length; i++) {
    for (int j = 0; j < arr[j].length; j++) {
        arr[i][j] = array[j];
    }
}

给出结果:

[[W, U, B], [W, U, B], [W, U, B], [W, U, B]]

如何获得:

[[W, U, B], [W, U, B], [A, B, C], [W, U, B]]

【问题讨论】:

    标签: java arrays multidimensional-array split


    【解决方案1】:

    您为arr[i][j] 分配了错误的值:

    for (int i = 0; i <arr.length ; i++) {
        for (int j = 0; j <arr[j].length ; j++) {
            arr[i][j] = array[i * arr[j].length + j];
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过一个循环来完成,遍历array,并使用除法和余数运算符计算索引到arr

      for (int i = 0; i < array.length; i++)
          arr[i / 3][i % 3] = array[i];
      

      测试

      String song = "WUBWUBABCWUB";
      String[] array = song.split("");
      System.out.println(Arrays.toString(array));
      
      String[][] arr = new String[4][3];
      for (int i = 0; i < array.length; i++)
          arr[i / 3][i % 3] = array[i];
      System.out.println(Arrays.deepToString(arr));
      

      输出

      [W, U, B, W, U, B, A, B, C, W, U, B]
      [[W, U, B], [W, U, B], [A, B, C], [W, U, B]]
      

      【讨论】:

        【解决方案3】:

        问题出在arr[i][j] = array[j]。变量j 应该继续。当外部循环传递到下一次迭代时,请使用不会再次分配0 的变量,因为内部循环再次执行j = 0。在循环之外使用另一个计数器来维护该值,在本例中为 k

        public class Main
        {
            public static void main(String[] args)
            {
        
                String[] array = { "W", "U", "B", "W", "U", "B", "A", "B", "C", "W", "U", "B" };
                String array2[][] = new String[4][3];
        
                // One dimension array into a two dimension array.
                int k = 0;
                for (int i = 0; i  <array2.length ; i++)
                {
                    for (int j = 0; j < array2[j].length; j++)
                    {
                        array2[i][j] = array[k++];
                    }
                }
        
                // Print 1 dimension array.
                System.out.println("array:");
                for (int i = 0; i < array.length; i++)
                {
                    System.out.print(array[i] + " ");
                }
        
                // Print 2 dimension array.
                System.out.println("\n\narray2:");
                for (int i = 0; i < array2.length; i++)
                {
                    for (int j = 0; j < array2[i].length; j++)
                    {
                        System.out.print(array2[i][j] + " ");
                    }
        
                    System.out.println();
                }
        
            }
        }
        

        【讨论】:

          【解决方案4】:

          你可以按如下方式处理这个数组:

          String[] arr = "WUBWUBABCWUB".split("");
          
          String[][] arr2d = IntStream
                  .iterate(0, i -> i < arr.length, i -> i + 3)
                  .mapToObj(i -> Arrays
                          .stream(arr, i, Math.min(i + 3, arr.length))
                          .toArray(String[]::new))
                  .toArray(String[][]::new);
          
          System.out.println(Arrays.deepToString(arr2d));
          // [[W, U, B], [W, U, B], [A, B, C], [W, U, B]]
          

          另见:Copying a 1d array to a 2d array

          【讨论】: