如何使用IntStream来汇总int数组的特定索引号?

And*_*dre 5 java lambda java-stream

所以,我一直在用lambdas学习Kotlin和Java.尽管我对函数式编程知之甚少,但我还是尝试使用大部分功能性编程.

我正在使用HackerRank的问题来研究(和Koans一起研究Kotlin).我目前正在使用Kotlin和Java 8解决问题.

我正在尝试解决MiniMax-Sum问题https://www.hackerrank.com/challenges/mini-max-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")
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用范围方法,与sort和sum一起使用.有用.问题是sum总是返回一个int,有时sum是一个long值.这是我的代码:

long min = IntStream.range(0, arr.length)
        .sorted()
        .sum();

long max = IntStream.range(1, arr.length + 1)
        .sorted()
        .sum();
Run Code Online (Sandbox Code Playgroud)

结果是输入的10(min)和15(max) IntStream


非常感谢花时间提供帮助的每个人!猜猜我没有看到List方法: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()));
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Hol*_*ger 7

虽然您可以通过排序来解决此任务,但如其他答案所示,这是不必要的工作."总结五个中的四个"值意味着"除了一个之外的所有",所以你所要做的就是从所有元素的总和中减去一个元素.减去最大元素以获得最小总和为4,减去最小元素以获得最大总和为4:

IntSummaryStatistics s = IntStream.of(1, 3, 5, 7, 9).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());
Run Code Online (Sandbox Code Playgroud)
16 24
Run Code Online (Sandbox Code Playgroud)

或者,如果源是一个数组:

IntSummaryStatistics s = Arrays.stream(array).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());
Run Code Online (Sandbox Code Playgroud)

  • 我可能错误地提出了这个问题,@ nullpointer.谢谢您的帮助! (2认同)