给出以下二维数组
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};
如何使用Java 8 Stream API逐列展平它?我想得到:
int[] result = {1, 3, 5, 2, 4, 6};
我尝试做一个简单的flatMap,但这会逐行展平并导致顺序错误:
// result is { 1, 2, 3, 4, 5, 6 }
int[] result = Arrays.stream(arr)
.flatMapToInt(Arrays::stream)
.toArray();
我首先考虑了transposing the array,以便可以使用上面的代码段,但是似乎不需要创建数组的中间转置副本。如何直接按列平面映射?
可以假定所有嵌套数组的长度都相同。
答案 0 :(得分:4)
您可以将内部索引和flatMap
流式传输到每个外部数组:
IntStream.range(0, arr[0].length)
.flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
.toArray()
答案 1 :(得分:1)
如果我们假设所有嵌套数组的长度都相同,则可以使用嵌套循环:
int[][] arr = {{1, 2}, {3, 4}, {5, 6}};
int[] res = new int[arr.length * arr[0].length];
int j = 0;
for (int i = 0; i < arr[0].length; i++) {
for (int[] a : arr) {
res[j++] = a[i];
}
}
System.out.println(Arrays.toString(res)); // [1, 3, 5, 2, 4, 6]