【问题标题】:How to flatten 2D array to 1D array?如何将二维数组展平为一维数组?
【发布时间】:2011-02-03 21:15:31
【问题描述】:

如何将二维数组int originalArray[][] 展平为一维数组?

    int a [] = {1,2,6,7,2};
    int b [] = {2,44,55,2};
    int c [] = {2,44,511,33};

    int originalArray [][] = new int[][]{a,b,c};

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    使用Guava,您可以使用任一

    int[] all = Ints.concat(originalArray);

    int[] all = Ints.concat(a, b, c);

    【讨论】:

    • 为什么被否决?当他们需要这样做时,谁愿意编写上面的所有代码?
    • 有什么方法可以对对象数组做同样的事情吗?
    • ObjectArrays.concat
    【解决方案2】:

    使用 Java 8,您可以“平面映射”内部数组:

    int[] flatArray = Arrays.stream(originalArray)
            .flatMapToInt(Arrays::stream)
            .toArray();
    

    或:

    int[] flatArray = Stream.of(a, b, c)
            .flatMapToInt(Arrays::stream)
            .toArray();
    

    【讨论】:

      【解决方案3】:

      一个简单的 for 循环就可以了,这并不难,但取决于您要复制值的顺序。例如(基于在您的示例中数组都具有相同长度的事实):

      int[] newArray = new int[3 * a.length];
      int index = 0;
      for (int n = 0; n < a.length; n++) {
          newArray[index++] = a[n];
          newArray[index++] = b[n];
          newArray[index++] = c[n];
      }
      

      or(不同的顺序,a、b、c可以有不同的长度):

      int[] newArray = new int[a.length + b.length + c.length];
      System.arraycopy(a, 0, newArray, 0, a.length);
      System.arraycopy(b, 0, newArray, a.length, b.length);
      System.arraycopy(c, 0, newArray, a.length + b.length, c.length);
      

      【讨论】:

      • 示例数组的长度不同。 a.length == 5,b.length == 4,c.length == 4。
      • 另外可能值得一提的是,如果这很重要,这两个示例最终会导致最终展平数组的排序不同。在第一个示例中,数组是“编织”的,而在第二个示例中,它们是“端到端”放置的,如果这有意义的话
      • @Kevin,我想我确实提到过:different order, a, b, c can be of different lengths
      【解决方案4】:

      会有2个步骤:

      1) 找出元素的总数来创建一个新的向量(一维数组)

      2) 以预定义的顺序遍历您的二维数组并将其元素复制到创建的向量中

      int elementsNumber = 0;
      
      for (int i = 0; i < originalArray.length; i++) {
         elementsNumber += originalArray[i].length;
      }
      
      int[] newArray = new int[elementsNumber];
      int j = 0;
      for (int i = 0; i < originalArray.length; i++) {
         System.arrayCopy (originalArray[i], 0, newArray, j, originalArray[i].length);
         j += originalArray[i].length;
      }
      

      【讨论】:

        【解决方案5】:
        int[] oneDArray = new int[arr.length*arr.length];
            //Flatten 2D array to 1D array...
            int s = 0;
            for(int i = 0; i < arr.length; i ++) 
                  for(int j = 0; j < arr.length; j ++){                           
                      oneDArray[s] = arr[i][j];
                      s++;
                  } 
        

        【讨论】:

          【解决方案6】:

          由于数组无法扩展(即您必须在初始化时声明错误的大小),因此您必须遍历数组两次:

          int size = 0;
          for (int[] ar : originalArray) size += ar.length;
          int[] result = new int[size];
          int pos = 0;
          for (int[] ar : originalArray) {
              System.arraycopy(ar, 0, result, pos, ar.length);
              pos += ar.length;
          }
          

          【讨论】:

          • 哇,我很惊讶递归不是必需的。
          • 可以不用循环吗?
          • @Jessy 好吧,你可以使用递归,但这会让事情变得更混乱和更慢。
          • 我想,我应该使用 arraycopy :-)
          • 注意:虽然它没有被指定为要求,但使用这种技术,没有办法在不保留其长度的情况下返回原始数组。 @rsp 的解决方案是一种能够逆转该过程的技术。只是指出扁平化的要求将决定解决方案。
          【解决方案7】:

          单线与 IntStream

          IntStream.concat(
              IntStream.concat( IntStream.of(originalArray[0]), IntStream.of(originalArray[1]) ),
                  IntStream.of(originalArray[2]) ).toArray();
          

          获取:[1, 2, 6, 7, 2, 2, 44, 55, 2, 2, 44, 511, 33]

          【讨论】:

            【解决方案8】:

            下面的代码可以将不同的二维数组(内部数组的大小不同)合并成一个一维数组:

             public static Integer[] merge2DArrays(int[][] twoDArray){
                    ArrayList<Integer> list = new ArrayList<>();
                    for (int i = 0; i < twoDArray.length; i++) {
                        for (int j = 0; j < twoDArray[i].length; j++) {
                            list.add(twoDArray[i][j]);
                        }
                    }
                return list.toArray(new Integer[list.size()]);
                }
            

            【讨论】:

              【解决方案9】:

              计算 originalArray 中元素的总数。创建该长度的新数组。将元素一一复制到新数组中。

              我不熟悉这样做的任何库函数。

              【讨论】:

                猜你喜欢
                • 2015-07-21
                • 2011-07-26
                • 2014-09-10
                • 2015-07-17
                • 2019-11-27
                • 2018-02-03
                • 2011-07-05
                • 2015-07-16
                • 1970-01-01
                相关资源
                最近更新 更多