java - 如何使用 IntStream 对 int 数组的特定索引数求和?
问题描述
我一直在用 lambda 学习 Kotlin 和 Java。我正在尝试尽可能多地使用函数式编程,即使我不太了解函数式编程。
我正在使用 HackerRank 的问题来研究(以及 Koans 来研究 Kotlin)。我目前正在使用 Kotlin 和 Java 8 解决问题。
我正在尝试解决MiniMax-Sum 问题。基本上,描述是这样的:
给定五个正整数,找出可以通过将五个整数中的四个恰好相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为单行的两个空格分隔的长整数。
我正在尝试使用 Java 中可以使用的大部分流 API。一个简单的问题是:在排序后,如何将 int 数组减少为其四个第一个元素(最后一个,在不同的场景中)并将其值求和?我正在尝试使用IntStream
,但似乎不使用 非常困难List
。我想知道是否可以直接使用int[]
数组IntStream
来排序和减少元素并将它们相加。
使用 Kotlin 我解决了这样的问题:
val minSum: Long = arr.sortedArray().copyOfRange(0, 4).sum().toLong()
val maxSum: Long = arr.sortedArray().copyOfRange(1, 5).sum().toLong()
println("$minSum $maxSum")
我正在尝试将该方法与andrange
一起使用。有用。问题是总和总是返回一个,有时总和是一个值。这是我的代码:sorted
sum
int
long
long min = IntStream.range(0, arr.length)
.sorted()
.sum();
long max = IntStream.range(1, arr.length + 1)
.sorted()
.sum();
输入的结果是 10(最小值)和 15(最大值)new long[] {256741038, 623958417, 467905213, 714532089, 938071625}
非常感谢所有花时间提供帮助的人!猜猜我没有看到LongStream.of
方法:DI 使用 2 种不同的方式解决(由@Aomine、@nullpointer 和 @Holger 指出):
// using Arrays and Stream
Arrays.sort(arr);
long min = Arrays.stream(arr, 0, 4).sum();
long max = Arrays.stream(arr, 1, 5).sum();
System.out.println(min + " " + max);
// and using LongSummaryStatistics (thanks @Holger)
LongSummaryStatistics ls = LongStream.of(arr).summaryStatistics();
System.out.println((ls.getSum() - ls.getMax()) + " " + (ls.getSum() - ls.getMin()));
非常感谢你们!
解决方案
虽然您可以通过排序来解决此任务,但如其他答案所示,这是不必要的工作。“五分之四相加”的意思是“除了一个之外的所有值相加”,所以你所要做的就是从所有元素的总和中减去一个元素。减去最大元素得到四的最小和,减去最小元素得到四的最大和:
IntSummaryStatistics s = IntStream.of(1, 3, 5, 7, 9).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());
16 24
或者,如果源是一个数组:
IntSummaryStatistics s = Arrays.stream(array).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());
推荐阅读
- prometheus - Prometheus alertmanager 倍增通知最重要
- php - 如何在codeigniter中获取多个通配符中的值
- vba - 命名范围更改时数据透视表不刷新[VBA]
- java - 如何在 SSL 配置的 tomcat 中缓存和更新 CRL(证书吊销列表)/OCSP 响应?
- python - GridSearchCV 在管道中将 fit_params 传递给 XGBRegressor 会产生“ValueError:需要超过 1 个值才能解包”
- java - 如何在 JavaFX 中将父级的大小与其子级的大小绑定,反之亦然?
- typescript - 缺少 CORS 标头“Access-Control-Allow-Origin”。发布到 API 时
- angular6 - Anhular 6 post方法tod在json中添加一行
- jenkins - 是否可以在 Jenkinsfile 中定义非阻塞输入步骤?
- graph - Power BI:当源包含空值时使折线图连续(处理缺失值)