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