如何在java中获得DoubleStream中的第K个最大元素
在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://*.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://*.com/questions/251781/how-to-find-the-kth-largest -element-in-an-unsorted-array-of-length-n-in-on) – geocar