半順序が定義されている要素のコレクションを保持し、トポロジカル順序でそれらの要素を反復できるデータ構造のJava実装を探しています(可能な順序はどれでも問題ありません。できれば安定しています)。コレクションの内容が変更されたときの順序)。
理想的には、、、、またはインターフェイスを実装し、インターフェイス上のすべてのメソッドをサポートしますCollection<E>
。全体の順序を指定するという点では、コレクションは。でインスタンス化でき、比較対象の2つの要素が相互に順序付けされていない場合、コンパレータは例外(?)をスローする可能性があります。ボーナスとして、挿入されている要素が順序異常(要素の順序グラフのサイクル)を生成する場合、例外がスローされます。Set<E>
SortedSet<E>
Comparator<E>
ClassCastException
そうですね、トポロジカルソートが必要ですが、SortedSetがコレクションをソートされた順序で維持するのと同様に、挿入/削除のたびにそのソート順を維持するコレクションオブジェクトが必要です。
このようなものはありますか?いくつかのオープンソースライブラリでは?
参照:
http://en.wikipedia.org/wiki/Partially_ordered_set
http://en.wikipedia.org/wiki/Topological_sorting
アップデート
要件のパフォーマンスへの影響(および、ポセットを使用して完全に解決できなかった他のさまざまな問題)を認識した後、ポセットを必要としないという別のアプローチを採用することになりました。要素間の順序を決定するためにコンパレータに依存するということは、要素の挿入については、既存のすべての要素に対してコンパレータを参照する必要があり、挿入ごとにO(n)のコストがかかることを意味します。
パフォーマンスがそれほど重要ではなく(そうである場合)、要素の数が合理的なものに制限されている場合(そうではない)、おそらく私自身のグラフの実装とトポロジカルを使用して、ウィリーによって提案されたアプローチを採用したと思います依存関係を最小限に抑えるために実装をソートします。