在java中獲取DoubleStream中第K個最大元素的最佳方法是什麼?如何在java中獲得DoubleStream中的第K個最大元素
我知道我們可以做.max()。getDouble()來獲得最大的元素。
在java中獲取DoubleStream中第K個最大元素的最佳方法是什麼?如何在java中獲得DoubleStream中的第K個最大元素
我知道我們可以做.max()。getDouble()來獲得最大的元素。
doubleStream.boxed()
.sorted(Comparator.reverseOrder())
.skip(k - 1)
.findFirst()
.orElse(null);
會給你第k個最大元素,或者null
如果有小於流中的k個元素。
一旦你有DoubleStream
,使其sorted()
以相反的順序(DESC)。然後limit(k)
和排序ASC並採取first
。
.boxed()
.distinct() //in case you want to ignore repeating values
.sorted(Comparator.reverseOrder())
.limit(k)
.sorted()
.findFirst());
它將返回第k個最小的元素,而不是最大的元素。 – ZhekaKozlov
如果列表中有重複,直到第n個數字假設我們想要找到第2個最大,並且數組是2,1,6,6 ,那麼通過排序它會給出6,6,2,1,第二個將給出6但是這不是真的 –
@xenteros你限制'k'最小元素 – ZhekaKozlov
OptionalDouble kthLargest = stream
.map(i -> -i) // Trick to sort in reverse order
.sorted()
.distinct() // Remove duplicates
.map(i -> -i)
.skip(k - 1)
.findFirst();
@Holger Stream可能包含少於'k'元素 – ZhekaKozlov
@Holger這個解決方案比使用盒裝流降序排序(這可能更易於閱讀)更好更快/更高的內存效率? –
@Malte Hartwig:這取決於流的大小和實現。 AFAIK,當在當前實現中使用'distinct()'時,無論如何你都會有拳擊開銷。但是如果你真的需要這個操作是有效的,你就不應該使用,而是做一些事情[像這樣](https://stackoverflow.com/q/5380568/2711488);對於k個最小或最大元素也是如此。 – Holger
您是否嘗試過搜索它?有很多問題涉及在各種數據結構中查找第k個最大元素。 – Henry
[No code](http://idownvotedbecau.se/nocode)和[no attempt](http://idownvotedbecau.se/noattempt),請看[ask]。 – Alex
[如何在O(n)中找到長度爲n的未排序數組中的第k個最大元素?](https://stackoverflow.com/questions/251781/how-to-find-the-kth-largest -element-in-an-unsorted-array-of-length-n-in-on) – geocar