如何在java中获得DoubleStream中的第K个最大元素

问题描述:

在java中获取DoubleStream中第K个最大元素的最佳方法是什么?如何在java中获得DoubleStream中的第K个最大元素

我知道我们可以做.max()。getDouble()来获得最大的元素。

+2

您是否尝试过搜索它?有很多问题涉及在各种数据结构中查找第k个最大元素。 – Henry

+2

[No code](http://idownvotedbecau.se/nocode)和[no attempt](http://idownvotedbecau.se/noattempt),请看[ask]。 – Alex

+0

[如何在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

doubleStream.boxed() 
      .sorted(Comparator.reverseOrder()) 
      .skip(k - 1) 
      .findFirst() 
      .orElse(null); 

会给你第k个最大元素,或者null如果有小于流中的k个元素。

对流进行排序,将其转换为数组并获取array.length-k处的项。

例子:

private static double getKth(DoubleStream ds, int k) { 
    double[] array = ds 
     .sorted() 
     .toArray(); 
    return array[array.length-k]; 
} 

你应该添加验证,以确保k有一个合法的值

+0

或者使用skip和limit代替'.toArray();' – c0der

+0

@ c0der介意显示一些代码? – alfasin

+0

我会试一试(我不是下来的选民) – c0der

一旦你有DoubleStream,使其sorted()以相反的顺序(DESC)。然后limit(k)和排序ASC并采取first

.boxed() 
.distinct() //in case you want to ignore repeating values 
.sorted(Comparator.reverseOrder()) 
.limit(k) 
.sorted() 
.findFirst()); 
+1

它将返回第k个最小的元素,而不是最大的元素。 – ZhekaKozlov

+1

如果列表中有重复,直到第n个数字假设我们想要找到第2个最大,并且数组是2,1,6,6 ,那么通过排序它会给出6,6,2,1,第二个将给出6但是这不是真的 –

+0

@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(); 
+0

@Holger Stream可能包含少于'k'元素 – ZhekaKozlov

+0

@Holger这个解决方案比使用盒装流降序排序(这可能更易于阅读)更好更快/更高的内存效率? –

+2

@Malte Hartwig:这取决于流的大小和实现。 AFAIK,当在当前实现中使用'distinct()'时,无论如何你都会有拳击开销。但是如果你真的需要这个操作是有效的,你就不应该使用,而是做一些事情[像这样](https://*.com/q/5380568/2711488);对于k个最小或最大元素也是如此。 – Holger