どのようにSortedSetの最後の25個の要素を取得しますか?
質問
Javaでは、私、10万個の要素を有することができるにSortedSetを持っています。私は、効率的かつエレガントに、最後の25個の要素を取得したいと思います。私は少し困惑しています。
私は反復処理し、25個の要素の後に停止したい25 の最初ののを取得します。しかし、私は逆の順序で繰り返し処理する方法がわかりません。任意のアイデア?
SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
解決
あなたはNavigableSet
を必要としています。そうでなければ、あなたは全体のSortedSet
を反復して、25個の要素でトリミング保つQueue
に要素を収集し、非効率的にそれを行う必要があるでしょう。
他のヒント
SortedSet<T>
だけ、これ上位nエントリを見つけることは容易である前方に、非常に単純な反復モデルを想定して設計されましたが、最後を見つけることは、最後のn個のエントリの窓を維持するイテレータを通じて高価な読み取りが必要になります。
NavigableSet<T>
の1.6解くに追加しますこの(あなたのための代替で低下する可能性があるので、1.4 TreeSetのからのみにSortedSetの実装は、それを実装し)ます。
NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed
あなたのソートを逆にし、最初の25の項目を取ります。あなたは、その唯一の25項目として効率的になるものを逆にすることができます。
ブルース
の異なるデータ構造は、この操作のために、より適切であろう。
これは、エレガントな方法か、非常に効率的なのではなく、にSortedSetが昇順であるあなたが最終()アイテムを取得し、別のリストに格納、それを取り外してから、25回繰り返したと仮定すると。あなたはその後、再び、これらの要素を入れなければならないでしょう!
あなたは<のhref = "https://github.com/geniot/indexed-tree-map/blob/master/src/src/main/java/com/dictiography/collections/を見てみたいことがありIndexedTreeMap.java」のrel = "nofollowをnoreferrer"> IndexedTreeMap の中インデックス付けツリーマップの
反復なしインデックスにある要素を取得する正確な(サイズ25)を使用します。
)(一覧に設定を投げるとのsubListを使用しています。私はそれがリストを作成することがいかにパフォーマンスはわからないので、あなたは、いくつかのテストを実行する必要があると思います。それは確かにかかわらず、コーディングが簡単に作ると思います。
List f = new ArrayList( summaries);
List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );
私は、これは、プロジェクト内の任意の実際の使用の可能性は低いと仮定していますが、それはあなたが単に代わりに、反対方向にソートされたリストを持っていることができるかもしれないということは注目に値します。)