Biorąc pod uwagę następną dwuwymiarową tablicę

int[][] arr = {{1, 2}, {3, 4}, {5, 6}};

Jak mogę spłaszczyć kolumnę IT za pomocą API strumienia Java 8? Chcę dostać:

int[] result = {1, 3, 5, 2, 4, 6};

Próbowałem wykonać prostych płaski, ale to spłaszcza wiersz wierszowy i wyniki w niewłaściwym porządku:

// result is { 1, 2, 3, 4, 5, 6 }
int[] result = Arrays.stream(arr)
    .flatMapToInt(Arrays::stream)
    .toArray();

Uważam się za przeładowanie tablicy najpierw, że mogę Użyj powyższego fragmentu, ale tworzenie pośredniej, transponowanej kopii tablicy wydaje się niepotrzebne. Jak mogę naprawić kolumnę bezpośrednio?

Można założyć, że wszystkie zagnieżdżone macierze są o tej samej długości.

-2
griips21 1 marzec 2019, 00:00

2 odpowiedzi

Najlepsza odpowiedź

Możesz przesyłać strumieniowo indeksy wewnętrzne i flatMap do każdej tablicy zewnętrznej:

IntStream.range(0, arr[0].length)
        .flatMap(i -> Arrays.stream(arr).mapToInt(a -> a[i]))
        .toArray()
4
Naman 1 marzec 2019, 07:48

Jeśli zakładamy, że wszystkie zagnieżdżone macierze są tej samej długości, możemy użyć zagnieżdżonych pętli:

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]
1
Karol Dowbecki 28 luty 2019, 21:09