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未満の要素がある場合は、あなたのk 番目の最大の要素、またはnull
を与えるだろう。
ストリームをソートし、配列に変換し、array.length-kで項目を取得します。
例:
private static double getKth(DoubleStream ds, int k) {
double[] array = ds
.sorted()
.toArray();
return array[array.length-k];
}
あなたがDoubleStream
を持っていたらk
は、合法的な値
を持っていることを確認する検証を追加する必要があり、その逆の順番(DESC)でsorted()
します。次に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となり、2番目に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ストリームは 'k'個未満の要素を含む可能性があります – ZhekaKozlov
@Holgerこのソリューションは、ボックス化されたストリームを使用してソートされたストリームを使用するよりも読み込みが容易になります。 –
@Malte Hartwig:ストリームのサイズと実装に依存します。 AFAIKは、現在の実装で 'distinct()'を使用すると、とにかくボクシングオーバーヘッドがあります。しかし、この操作が効率的であることが本当に必要な場合は、どちらも使用する必要はありませんが、[このような]何かを行う必要があります(https://stackoverflow.com/q/5380568/2711488)。 k個の最小または最大の要素については同じです。 – Holger
あなたはそれを検索しようとしましたか?さまざまなデータ構造でk番目に大きい要素を見つけることに対処する質問がたくさんあります。 – Henry
[No code](http://idownvotedbecau.se/nocode)と[試みません](http://idownvotedbecau.se/noattempt)については、[ask]を参照してください。 – Alex
[O(n)の長さnのソートされていない配列のk番目に大きい要素を見つける方法](https://stackoverflow.com/questions/251781/how-to-find-the-kth-largest -element-in-an-sort-length-n-in-on) – geocar