私はラムダでKotlinとJavaを勉強してきました。私は関数型プログラミングの多くを知らないにもかかわらず、私ができることを使用して、関数型プログラミングのほとんどをしようとしています。
私は(うまくとしてKotlinを研究し、Koans)勉強するHackerRankの問題を使用しています。私は現在、KotlinとJava 8の両方を使用して問題を解決しています。
私が解決しようとしているMiniMaxの和の問題を。基本的には、説明はこのようなものです:
5つの正の整数を考えると、正確に4つ5つの整数のを加算することにより算出することができ、最小値と最大値を見つけます。次に、2つのスペースで区切られた長整数の単一線としてそれぞれ最小値と最大値を印刷します。
私は時にJavaで私ができることをストリームAPIのほとんどを使用しようとしています。簡単な質問です:どのように私は(別のシナリオでは、最後の)その4つの第1の要素に、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")
私が使用しようとしているrange
方法を、一緒に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は(@Aomine、@nullpointerと@Holgerによって指し示さ)2つの異なる方法を用いて解きます。
// 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()));
たくさんのみんなありがとう!
あなたは他の回答に示すように、ソートすることにより、このタスクを解決することができますが、これは不必要な作業です。ので、すべてあなたがしなければならない、すべての要素の合計から一つの要素を減算することで、「すべてが、1つを合計する」「サミング4 5のうち、」値手段。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());
16 24
または、ソースが配列の場合:
IntSummaryStatistics s = Arrays.stream(array).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());