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