2011-08-07 11 views
6

オプション1:値を追加するたびにComparableを実装し、collections.sort(List l)を使用してソートするリストを作成します。 オプション2:TreeSetを作成します(それ自体が常にソートされます)。比較可能なVs TreeSetのリスト

どちらが高速になりますか?私はこれを頼んでいるのは、Listが私に必要なListIteratorのオプションを与えるからです。なぜなら、反復中に要素を追加できるからです。

+0

私のデータ構造には約100-200個のカスタムオブジェクトがあります。 – aps

+0

あなたのコレクションを[他のOPSと比較して]更新する頻度はどのくらいですか?また、TreeSetは重複を防ぎます、リストはありません - この問題についてのあなたのポリシーは何ですか? – amit

+0

申し訳ありませんが、私は何かが間違って言った。実際には、私のコレクションは、プログラムの実行時間の最初の10%でかなり頻繁に更新されます。その後、オブジェクトの数はほぼ一定になるので、ソートはもう必要ありません。その後、私はオブジェクトのプロパティを更新します。 – aps

答えて

13

最も重要な違い:

Criterion  | List with Collections.sort | TreeSet 
----------------+----------------------------+--------- 
cost of adding | O(n log n)     | O(log n) 
equal sort keys | permitted     | eliminated as duplicates 
iteration  | bidirectional, can insert | unidirectional, can not insert 

ConcurrentModificationExceptionを得ることなく繰り返し処理を行う場合、要素を挿入するには、あなたが行うことができます:

for (E e : new ArrayList<E>(collection)) { 
    // some other code 

    collection.add(anotherE); 
} 
2

ここでツリーセットを使用してください。

TreeSetに追加する操作はlog(n)です。リストに追加するのはconst timeですが、ソートするのはn log(n)です。

+1

をTreeSetに挿入すると自動的にソートされるので、ツリーセットのlog(n)とリストのソートのためのnlog(n)。 –

3

Collections.sortがnlogで修正マージソートを使用しています(n)ソート時間。追加するたびにメソッドを呼び出すと、n^2log(n)の時間になる可能性があります。 TreeSetの挿入はlog(n)を保証します。したがって、追加するたびに呼び出すと、n.log(n)になります。ですから、代わりにTreeSetを使うことをお勧めします。しかし、TreeSetは重複を許さないので、あなたの決定に影響するかもしれません。

Listを使用している場合、Collections.sortを使用する代わりに、最適化することが1つあります。リストに要素を挿入するたびにリストがソートされるので、ここでの挿入並べ替えを使用すると、そのような場合に挿入の並べ替えが優れているため、パフォーマンスが向上します。

+0

重複は必要ありません。しかし、反復処理中にコレクションにオブジェクトを追加する必要がありました。だから私はリストを検討していた。 – aps

関連する問題