使用 Stream 创建随机整数列表并对除最小之外的所有元素求和?

cdp*_*iva 5 java java-stream

我想生成 4 个随机数,范围从 1 到 6(含)。然后我想得到这些元素的总和(不包括最小值)。

我目前正在创建一个流来填充列表:

List<Integer> values =  r.ints(4,1,7).boxed().collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

然后我删除最小值并使用另一个流来获取值的总和:

values.stream().mapToInt(Integer::intValue).sum();
Run Code Online (Sandbox Code Playgroud)

有人可以建议一种在单个流中执行所有这些操作的方法吗?

Boh*_*ian 8

对流进行排序,然后跳过第一个(即最小的)元素:

int sumExceptSmallest = IntStream.of(4,1,7).sorted().skip(1).sum(); // 11
Run Code Online (Sandbox Code Playgroud)

或者根据您的具体情况:

int sumExceptSmallest = r.ints(4,1,7).sorted().skip(1).sum();
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这对于编码器来说可能是最酷和最有效的,但它并不是最有效的解决方案,因为排序的时间复杂度为 O(n log n)。最有效的运行时间是单次查找最小值并计算总和,然后从另一个中减去一个,在 O(n) 时间内产生解决方案。


Rog*_*gue 5

使用IntSummaryStatistics可以在流中通过单次计算来计算此值:

IntStream stream = /* random stream of integers */;
IntSummaryStatistics stats = stream.summaryStatistics();
int sum = stats.sum();
sum -= stats.min(); //sum, minus the lowest element
Run Code Online (Sandbox Code Playgroud)