Отображение 2D-массива по столбцам, а не по строкам в Java - PullRequest
0 голосов
/ 01 марта 2019

Учитывая следующий двумерный массив

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

Я рассмотрел сначала транспонируем массив , чтобы я мог использовать приведенный выше фрагмент, но создание промежуточной транспонированной копии массива кажется ненужным.Как я могу отобразить непосредственно по столбцу?

Можно предположить, что все вложенные массивы имеют одинаковую длину.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете передавать внутренние индексы и flatMap в каждый внешний массив:

IntStream.range(0, arr[0].length)
        .flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
        .toArray()
0 голосов
/ 01 марта 2019

Если мы предположим, что все вложенные массивы имеют одинаковую длину, мы можем использовать вложенные циклы:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...