在Java中按列而不是按行对2D数组进行平面映射

时间:2019-02-28 21:00:07

标签: java java-stream

给出以下二维数组

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,以便可以使用上面的代码段,但是似乎不需要创建数组的中间转置副本。如何直接按列平面映射?

可以假定所有嵌套数组的长度都相同。

2 个答案:

答案 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]