Преобразуйте массив массивов через потоки - PullRequest
0 голосов
/ 29 мая 2018

У меня есть массив, такой как

int[][] weights = {{1, 3, 2}, {2, 1, 4}, {2, 3, 3}, {3, 4, 2}, {4, 2, 1}};

Мне нужно получить из каждого массива {x, y, z} два массива {x, y, z} и {y, x, z}.Примерно так

int[][] resultWeights = {{1, 3, 2}, {3, 1, 2}, {2, 1, 4}, {1, 2, 4} ... 

Как это можно сделать с помощью потоков?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Мне нужно получить из каждого массива {x, y, z} два массива {x, y, z} и {y, x, z}.

Итерировать ваш источник и явно создавать новые записи:

int[][] weights = ...
// Every entry yields two
int[][] resultWeights = new int[weights.length * 2][];

// Iterate all entries
int i = 0;
for (int[] entry : weights) {
    // Copy entry
    resultWeights[i] = entry;
    i++;
    // Other version
    resultWeights[i] = new int[] { entry[1], entry[0], entry[2] };
    i++;
}

Обратите внимание, что вместо этого вы можете сделать resultWeights[i++].Хотя некоторые программисты могут быть незнакомы.


Как вы специально просили для потоков:

int[][] weights = ...
int[][] resultWeights = Arrays.stream(weights)
    .flatMap(entry -> Stream.of(entry, new int[] { entry[1], entry[0], entry[2] }))
    .toArray(int[][]::new);
0 голосов
/ 29 мая 2018

Просто flatMap каждая запись {x, y, w} в поток массивов [{x, y, w}, {y, x, w}].Примерно так должно работать:

Arrays.stream(weights)
  .flatMap(arr -> {
    int[] opp = new int[]{arr[1], arr[0], arr[2]};
    return Stream.of(arr, opp);
  })
  .toArray(i -> new int[i][]);

Пример полного кода:

import java.util.stream.*;
import java.util.Arrays;

class SymmetrizeGraphMatrix {
  public static void main(String[] args) {
    int[][] weights = {{1, 3, 2}, {2, 1, 4}, {2, 3, 3}, {3, 4, 2}, {4, 2, 1}};
    int[][] result = Arrays.stream(weights)
      .flatMap(arr -> {
        int[] opp = new int[]{arr[1], arr[0], arr[2]};
        return Stream.of(arr, opp);
      })
      .toArray(i -> new int[i][]);

    for (int[] xyw : result) {
      System.out.println(Arrays.toString(xyw));
    }
  }
}

Вывод:

[1, 3, 2]
[3, 1, 2]
[2, 1, 4]
[1, 2, 4]
[2, 3, 3]
[3, 2, 3]
[3, 4, 2]
[4, 3, 2]
[4, 2, 1]
[2, 4, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...