【问题标题】:SUM of elements of N Arrays using Java 8 Stream使用 Java 8 Stream 对 N 个数组的元素求和
【发布时间】:2020-04-02 00:26:40
【问题描述】:

我可以有 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数组吗?
  • 是的,很抱歉
  • 别担心,希望答案有所帮助。
  • 为什么您期望List&lt;String&gt; result?你能分享给定输入的预期输出吗?
  • 所有元素的总和,可以使用int sum = Stream.of(arr1, arr2, arr3) .flatMap(Arrays::stream) .mapToInt(i -&gt; i) .sum();

标签: java arrays sum java-stream


【解决方案1】:

如果你想要数组中所有整数的总和,你可以这样做:

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&lt;List&lt;Integer&gt;&gt; 以收集求和所需的所有整数。
  • 对每个列表进行求和运算。
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]

【讨论】:

  • 添加了 @Cristiano Bertolini
  • 就是这样!你的最终结果是正确的!但是,它适用于 3 个数组。我不知道我会有多少个数组。数组的数量总是 >= 2。这些数组在这样的列表中 List&lt;Integer[]&gt; myarrays = new ArrayList(); 然后,得到每个 Integer[] arr1 = myarrays .get(i); 所以,问题是我如何将你的解决方案用于 N 个数组。
  • 在这个例子中,它使用了Stream.of(arr11, arr12, arr13),但是你可以根据需要传递任意数量的数组。因此,如果您有myarrays,那么您可以将Stream.of(arr11, arr12, arr13) 替换为myarrays.stream() @CristianoBertolini
  • 100% 正确。正是!
【解决方案2】:

这应该可行。我们创建一个包含所有数组的 Stream,然后将这些数组的总和映射为整数并找到最大值。

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

【讨论】:

  • 这不会因为IntStream.of(array) 的存在而被调用int[] 并且您为什么要在答案中找出max 这与所提出的问题相去甚远?
  • 这确实可以编译,但你是对的,我可以发誓,用户曾在某一时刻从所有数组中请求max。我可能是错的,但它可能已被编辑。
  • 无法追踪的编辑只能在少数(约 5 分钟)内完成,并且答案是在提问后 9 分钟做出的。所以不确定你需要宣誓什么。如果你认为arrNInteger [],这将无法编译。
  • 不需要装箱,直接用int[]即可。此外,您在主帖中提供了总和的评论,所以我不确定您为什么对我提供总和的原因如此困惑。
【解决方案3】:

从您的问题中不清楚您想要什么。因此,我们只能猜测您的问题并猜测解决方案。请用文字描述你想做什么。如果您的代码大多不正确,那么您可以期望人们给出不正确的解决方案。看起来您想找出 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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2020-06-28
    • 2016-07-06
    • 2017-08-24
    • 2014-07-31
    • 2018-03-03
    相关资源
    最近更新 更多