簡體   English   中英

如何使用IntStream來匯總int數組的特定索引號?

[英]How can I use an IntStream to sum specific indexed numbers of an int array?

我一直在用lambdas學習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")

我正在嘗試使用range方法,以及sortedsum 有用。 問題是sum總是返回一個int ,有時sum是一個long值。 這是我的代碼:

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

long max = IntStream.range(1, arr.length + 1)
        .sorted()
        .sum();

輸入new long[] {256741038, 623958417, 467905213, 714532089, 938071625}結果為10(min)和15(max)


非常感謝花時間提供幫助的每個人! 猜猜我沒有看到LongStream.of方法:DI使用兩種不同的方式解決(由@ 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()));

非常感謝!

雖然您可以通過排序來解決此任務,但如其他答案所示,這是不必要的工作。 “總結五個中的四個”值意味着“除了一個之外的所有”,所以你所要做的就是從所有元素的總和中減去一個元素。 減去最大元素以獲得最小總和為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());

您可能只是在尋找像Intstream.range(int startInclusive, int endExclusive)這樣的Intstream.range(int startInclusive, int endExclusive)

startInclusive (包括)到endExclusive (不包括)的遞增步長返回順序排序的IntStream。

在這些然后可以執行任一sum直接或使用IntSummaryStatisticssummaryStatistics()以進一步訪問計數,平均,最大值,最小值等。

Edit2 :如果你期待得到總和那么long使用summaryStatistics().getSum()

Edit2 :如果您特意想要訪問數組數據的統計信息,可以使用Arrays.stream​(int[] array, int startInclusive, int endExclusive) ,它也會返回一個Instream

如果你真的想使用流,那么利用跳過和限制:

Arrays.stream(myArray).sorted().limit(4).sum();
Arrays.stream(myArray).sorted().skip(1).limit(4).sum();

假設您已經有一個現有的數組,只想在Java中復制您的Kotlin代碼。


至於生成索引,請查看IntStream.range

例如

IntStream.range(0, 4);

返回一個從03IntStream ,即4是獨占的, IntStream.rangeClosed(startInc, endInc)使一個人能夠生成從startIncendInc索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM