【发布时间】: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};
【问题讨论】:
如何将二维数组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};
【问题讨论】:
【讨论】:
ObjectArrays.concat
使用 Java 8,您可以“平面映射”内部数组:
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];
}
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);
【讨论】:
different order, a, b, c can be of different lengths
会有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[] 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++;
}
【讨论】:
由于数组无法扩展(即您必须在初始化时声明错误的大小),因此您必须遍历数组两次:
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 中元素的总数。创建该长度的新数组。将元素一一复制到新数组中。
我不熟悉这样做的任何库函数。
【讨论】: