2017-10-19 44 views
0

在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://stackoverflow.com/questions/251781/how-to-find-the-kth-largest -element-in-an-unsorted-array-of-length-n-in-on) – geocar

回答

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

會給你第k個最大元素,或者null如果有小於流中的k個元素。

0

對流進行排序,將其轉換爲數組並獲取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

-1

一旦你有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

2
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://stackoverflow.com/q/5380568/2711488);對於k個最小或最大元素也是如此。 – Holger

相關問題