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

问题描述 投票:-2回答:2

给出以下二维数组

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

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

java java-stream
2个回答
4
投票

您可以将内部索引和flatMap流式传输到每个外部数组:

IntStream.range(0, arr[0].length)
        .flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
        .toArray()

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]
© www.soinside.com 2019 - 2024. All rights reserved.