Mogę mieć N tablic o różnych długościach. Ważną rzeczą jest to, że nie wiem, ile tablic mogę mieć. Spójrzmy na przykład z zaledwie trzema tablicami:

Integer arr1[] = {5, 10, -5};
Integer arr2[] = {8, 3};
Integer arr3[] = {12, -1, 0, 9};

List<String> result = Arrays.stream(arr1)
        .flatMap(s1 -> Arrays.stream(arr2)
                .flatMap(s2 -> Arrays.stream(arr3)
                        .map(s3 -> s1 + s2 + s3)))
        .collect(Collectors.toList());

Czy można to zrobić dla N Arrays, używając Stream?

Tutaj chłopaki. Kolejny przykład z oczekiwanym wynikiem

 Integer arr1[] = {2, 4, 5};
 Integer arr2[] = {2, 4, 5};
 Integer arr3[] = {2 , 4, 5};

 List<Integer> result = Arrays.stream(arr1)
                .flatMap(s1 -> Arrays.stream(arr2)
                .flatMap(s2 -> Arrays.stream(arr3)
                .map(s3 -> s1 + s2 + s3))).sorted().collect(Collectors.toList());

                 System.out.println(" List of results: "+result);


              // List of results: [6, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15]
-1
Cristiano Bertolini 2 kwiecień 2020, 03:26

3 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz sumę wszystkich liczb całkowitych w tablicach, możesz zrobić to w następujący sposób:

int sumOfAll = Stream.of(arr1, arr2, arr3)
    .flatMap(Arrays::stream)
    .mapToInt(v -> v)
    .sum();

Jeśli chcesz otrzymać listę z sumą int na danej pozycji, możesz to zrobić w ten sposób. Oblicz maksymalną długość w tablicach, a następnie użyj jej do wstawienia wartości domyślnej, jeśli bieżąca lista jest za mała.

int max = Stream.of(arr1, arr2, arr3).mapToInt(a -> a.length).max().getAsInt();

List<Integer> reduce = Stream.of(arr1, arr2, arr3)
    .map(a -> Stream.of(a).collect(toList()))
    .reduce((a, b) -> IntStream.range(0, max)
        .mapToObj(i -> (i < a.size() ? a.get(i) : 0) + (i < b.size() ? b.get(i) : 0))
        .collect(toList()))
    .get();

AKTUALIZACJA

Jeśli chcesz osiągnąć to, co pokazałeś w drugim przykładzie, możesz to zrobić jak poniżej.

  • Utwórz List<List<Integer>>, który zbiera wszystkie liczby int, które są potrzebne do zsumowania.
  • Wykonaj operację sumowania dla każdej listy.
List<List<Integer>> integersList = Stream.of(arr11, arr12, arr13)
        .map(a -> Stream.of(a).map(x -> Arrays.asList(x)).collect(toList()))
        .reduce((a, b) -> b.stream().flatMap(v -> a.stream()
                        .map(x -> {
                                    ArrayList<Integer> ints = new ArrayList<>(x);
                                    ints.add(v.get(0));
                                    return ints;
                                }
                        )
                ).collect(toList())
        ).get();

To daje:

[[2, 2, 2], [4, 2, 2], [5, 2, 2], [2, 4, 2], [4, 4, 2], [5, 4, 2], [ 2, 5, 2], [4, 5, 2], [5, 5, 2], [2, 2, 4], [4, 2, 4], [5, 2, 4], [2, 4, 4], [4, 4, 4], [5, 4, 4], [2, 5, 4], [4, 5, 4], [5, 5, 4], [2, 2, 5], [4, 2, 5], [5, 2, 5], [2, 4, 5], [4, 4, 5], [5, 4, 5], [2, 5, 5] , [4, 5, 5], [5, 5, 5]]

Następnie podsumowując:

List<Integer> sum = integersList.stream()
        .map(a -> a.stream().reduce(Integer::sum).get())
        .sorted().collect(toList());

Ostateczny wynik:

[6, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14 , 14, 15]

0
lczapski 2 kwiecień 2020, 15:29

To powinno działać. Tworzymy strumień wszystkich tablic, a następnie mapujemy sumę tych tablic jako liczby całkowite i znajdujemy wartość maksymalną.

        int max = Stream.of(arr1, arr2, arr3)
                .map(array -> IntStream.of(array).sum())
                .max(Integer::compareTo)
                .orElseThrow(IllegalStateException::new);
0
Jason 2 kwiecień 2020, 00:34

Z twojego pytania nie wynika jasno, czego chcesz. Możemy więc tylko odgadnąć Twój problem i znaleźć rozwiązanie. Opisz słowami, co chcesz zrobić. Jeśli Twój kod jest w większości nieprawidłowy, możesz oczekiwać, że ludzie podadzą nieprawidłowe rozwiązania. Wygląda na to, że chcesz poznać sumę N tablic. Jeśli tak, oto rozwiązanie.

import java.util.Arrays;
import java.util.stream.Stream;

public class Temp {
    public static void main(String[] args) {
        Integer arr1[] = {5, 10, -5};
        Integer arr2[] = {8, 3};
        Integer arr3[] = {12, -1, 0, 9};

        System.out.println(doSomething(arr1, arr2, arr3));
    }

    public static Integer doSomething(Integer [] ... arrays){
        Integer sumOfArrays = Stream.of(arrays)
                .map( array -> Arrays.stream(array)
                        .reduce(0, (sum, nextInt) -> sum + nextInt )
                ).reduce( 0, (allArraySum, arraySum) -> allArraySum + arraySum );
        return sumOfArrays;
    }
}
0
armani 2 kwiecień 2020, 04:51