2017-11-23 9 views
2

HashMapを値のhereで並べ替えてみましたが、このソートされたHashMapの先頭のn個のエントリを抽出する方法はよくわかりません。あるいはこれを達成する良い方法がありますか?ソートされたHashMapで上位n個のエントリを選択する

いくつかの概要を説明するために、私はP2Pプロジェクトに取り組んでいます。ピアIDと、それらのピアのそれぞれからファイルをダウンロードできる対応するレートとの間のマッピングを維持しています。次に、最高のダウンロード速度を持つ上位のピアを選択する必要があります。

+2

ご質問は不明です。 'LinkedHashMap'を正しい順序で取得したら、値を繰り返し処理し、最初の(またはソート順に応じた)_n_エントリを取ってください。 –

+0

https://stackoverflow.com/a/23846961/1553851 – shmosel

+0

https://stackoverflow.com/q/109383/18157で確認してください。 –

答えて

2

明らかにカスタムコンパレータとTreeMapは、特にこのために調整されてメソッドを持っている、特に以来、より良い選択でしょう。あなたはHashMapを主張する一方

あなたは、このためのjava-8を使用することができます。

yourMap.entrySet() 
     .stream() 
     .sorted(Comparator.comparing(e -> e.getValue(), Comparator.reverseOrder())) 
     .limit(n) 
     .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 
+0

こんにちはユージーン! TreeMapのtop/bottom nの項目を返すメソッドはありません。 tailSetおよびheadSetは、指定された値よりも大きいかまたはより小さいサブセットビューを返します。あなたはこれのためにストリームの道を行く必要があります、他のオプションはありません。 –

+0

@FedericoPeraltaSchaffnerあなたのコメントにはおそらく私が紛失しているものがあります。私は 'headMap'を参照しています。実際にビューを返すのです... OPがここで求めているのは何ですか? – Eugene

+0

ねえユージン。私の指摘は、nが固定数であるTreeMapから上位n項目を選択する方法がないことです。 headSetは、指定された値よりも小さい(指定されたインデックスより小さくない)エントリのビューを返します。それが私の指摘でした。固定サイズのサブマップビューを返す簡単な方法はないことがわかります。エントリをストリーミングしてlimit(n)を使用し、新しいマップに収集する必要があります。 (これがあなたの答えをアップアップした理由です)。 –

2

HashMapの代わりにTreeSetクラスを使用することを検討してもよいので、いつでも並べ替えることができます。 'n'にアクセスするには、必要なものに応じてIteratorまたはsubSet()tailSet()のメソッドを使用できます。 headMap(Key k)このキーまであなたのすべてのエントリを与える:

+1

TreeSetとTreeMapのどちらでも上位n個のエントリを返すメソッドはありません。 tailSetおよびheadSetは、指定された値よりも大きいかまたはより小さいサブセットビューを返します。 –

関連する問題