Java Set は順序を保持しますか? メソッドが私にセットを返しています。おそらくデータは順序付けられていますが、セットを反復すると、データは順序付けられていません。これを管理するより良い方法はありますか?セット以外のものを返すようにメソッドを変更する必要がありますか?
13 に答える
インターフェイスは、Set
順序付けを保証しません。
そのサブインターフェースSortedSet
は、何らかの基準に従ってソートされたセットを表します。Java 6 には、 を実装する 2 つの標準コンテナーがありますSortedSet
。TreeSet
とですConcurrentSkipListSet
。
インターフェイスに加えて、クラスSortedSet
もあります。LinkedHashSet
要素がセットに挿入された順序を記憶し、その順序で要素を返します。
LinkedHashSetが必要です。
セットは単なるインターフェースです。順序を保持するには、そのインターフェースの特定の実装と、TreeSet や LinkedHashSet などのサブインターフェース SortedSet を使用する必要があります。Set を次のようにラップできます。
Set myOrderedSet = new LinkedHashSet(mySet);
注文を保持するには、List
または を使用しLinkedHashSet
ます。
Set
以下は、 Java で利用可能な標準実装の順序特性の簡単な要約です。
- 挿入順序を維持: LinkedHashSetおよびCopyOnWriteArraySet (スレッドセーフ)
- セット内でアイテムをソートしたままにします: TreeSet、EnumSet (列挙型に固有)、およびConcurrentSkipListSet (スレッドセーフ)
- アイテムを特定の順序で保持しません: HashSet (試したもの)
特定のケースでは、最初に項目を並べ替えてから、1 または 2 のいずれかを使用できます (ほとんどのLinkedHashSet
場合 またはTreeSet
)。または、代わりに、より効率的TreeSet
に、並べ替えを自動的に処理する並べ替えられていないデータを に追加することもできます。
のjavadocからSet.iterator()
:
このセット内の要素の反復子を返します。要素は特定の順序で返されません (このセットが保証を提供するクラスのインスタンスでない限り)。
そして、すでにshuuchanで述べられているように、 aは保証された順序を持つTreeSet
の実装です:Set
要素は、使用されるコンストラクターに応じて、自然順序付けを使用するか、セットの作成時に提供される Comparator によって順序付けられます。
通常、HashSet のようにエメレントをすばやく見つけるために set は順序を保持しませんが、LinkedHashSet を試すと、入力した順序が保持されます。
Set インターフェイス自体は、特定の順序を規定していません。ただし、SortedSet はそうします。
Set によって返される Iterator は、Ordered の方法でデータを返すことは想定されていません。これを参照してください同じコレクションへの2つのjava.util.Iterators: do they have to return elements in the same order?
SortedSet
の注文のみを行うことができますSet