繁体   English   中英

如何将二维数组展平为一维数组?

[英]How to flatten 2D array to 1D array?

如何将二维数组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};

使用Guava ,您可以使用

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

或者

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

使用 Java 8,您可以“flatMap”内部数组:

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

或者:

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

一个简单的 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];
}

或(不同的顺序,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);
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++;
          } 

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

由于数组不能扩展(即你必须在初始化时声明错误的大小),你必须遍历数组两次:

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

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]

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

 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()]);
    }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM