私はこれに対する迅速な答えを見つけることができないことに困惑しています。私は基本的に、java.util.List
インターフェイスを実装するが、そのメンバーをソートされた順序で格納するJavaのデータ構造を探しています。ノーマルArrayList
を使用Collections.sort()
して使用できることは知っていますが、リストからメンバーを追加したり、頻繁に取得したりするシナリオがあり、メンバーを取得するたびに並べ替える必要はありません。新しいものが追加されました。JDKやサードパーティのライブラリに存在するようなものを誰かに教えてもらえますか?
編集:データ構造は重複を保持する必要があります。
回答の要約:私はこれらすべてが非常に興味深く、多くのことを学びました。特にAioobeは、上記の要件(主に、重複をサポートするソートされたjava.util.List実装)を達成しようとする彼の忍耐力について言及する価値があります。私は彼の答えを私が尋ねたものに対して最も正確であり、私が尋ねたものが正確に私が必要としたものでなかったとしても、私が探していたものの意味を刺激するものとして最も考えました。
私が求めたものの問題は、リストインターフェイス自体とインターフェイスのオプションメソッドの概念にあります。javadocを引用するには:
このインターフェイスのユーザーは、リストのどこに各要素を挿入するかを正確に制御できます。
ソートされたリストへの挿入では、挿入ポイントを正確に制御することはできません。次に、いくつかのメソッドをどのように処理するかを考える必要があります。テイクadd
例えば:
public boolean add(Object o)
Appends the specified element to the end of this list (optional operation).
これで、1)コントラクトを破り、addのソートされたバージョンを実装する2)add
リストの最後に要素を追加し、ソートされた順序を破るという不快な状況に置かれます3)add
(オプションとして)スローして除外しますUnsupportedOperationException
ソート順に項目を追加する別の方法を実現します。
オプション3がおそらく最良ですが、使用できないaddメソッドと、インターフェイスにない別のsortedAddメソッドがあるのは不快だと思います。
その他の関連ソリューション(順不同):
- java.util.PriorityQueueは、おそらく私が要求したものよりも必要なものに最も近いものです。私の場合、キューはオブジェクトのコレクションの最も正確な定義ではありませんが、機能的には必要なすべてを実行します。
- net.sourceforge.nite.util.SortedList。ただし、この実装は、
add(Object obj)
メソッドに並べ替えを実装することでListインターフェイスの契約を破り、奇妙なことに、の効果のないメソッドがありadd(int index, Object obj)
ます。一般的なコンセンサスはthrow new UnsupportedOperationException()
、このシナリオではより良い選択かもしれないことを示唆しています。 - GuavaのTreeMultiSet重複をサポートするセットの実装
- ca.odell.glazedlists.SortedList このクラスには、javadocに警告があります。
Warning: This class breaks the contract required by List