簡體   English   中英

使用 Java 8 Stream 的 N 數組元素的總和

[英]SUM of elements of N Arrays using Java 8 Stream

我可以有 N 個不同長度的數組。 重要的是我不知道我可以擁有多少個數組。 讓我們舉一個只有 3 個數組的例子:

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

是否可以使用 Stream 為 N 個數組做這樣的事情?

在這里,伙計們。 另一個具有預期結果的示例

 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]

這應該有效。 我們創建所有數組的流,然后將這些數組的總和映射為整數並找到最大值。

        int max = Stream.of(arr1, arr2, arr3)
                .map(array -> IntStream.of(array).sum())
                .max(Integer::compareTo)
                .orElseThrow(IllegalStateException::new);

從你的問題中不清楚你想要什么。 因此,我們只能猜測您的問題並猜測解決方案。 請用文字描述你想做什么。 如果您的代碼大多不正確,那么您可以期望人們給出不正確的解決方案。 看起來你想找出 N 個數組的總和。 如果是,那么這里是解決方案。

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;
    }
}

如果你想要數組中所有整數的總和,你可以這樣做:

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

如果你想要一個給定位置整數總和的列表,那么你可以這樣做。 計算數組中的最大長度,如果當前列表太小,則使用它來插入默認值。

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

更新

如果你想實現你在第二個例子中展示的內容,那么它可以像下面那樣完成。

  • 創建List<List<Integer>>收集求和所需的所有整數。
  • 對每個列表進行求和操作。
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();

它給:

[[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]]

然后總結一下:

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

最后結果:

[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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM