Javaセットは順序を保持しますか?メソッドがSetを私に返し、データは順序付けされていると考えられますが、Setを反復処理すると、データは順序付けられません。これを管理するより良い方法はありますか?Set以外のものを返すようにメソッドを変更する必要がありますか?
Javaセットは順序を保持しますか?メソッドがSetを私に返し、データは順序付けされていると考えられますが、Setを反復処理すると、データは順序付けられません。これを管理するより良い方法はありますか?Set以外のものを返すようにメソッドを変更する必要がありますか?
回答:
Set
インタフェースは、任意の順序保証を提供していません。
そのサブインターフェースSortedSet
は、いくつかの基準に従ってソートされたセットを表します。Java 6には、を実装する2つの標準コンテナーがありますSortedSet
。彼らは、あるTreeSet
とConcurrentSkipListSet
。
SortedSet
インターフェースに加えて、LinkedHashSet
クラスもあります。要素がセットに挿入された順序を記憶し、その要素をその順序で返します。
LinkedHashSetが必要です。
List
はSet
(メンバーシップの一意性を保証するものではありません)ではありません。
メンバーの多くが提案したように、LinkedHashSetを使用してコレクションの順序を保持します。Uはこの実装を使用してセットをラップできます。
SortedSetの実装は、ソート順に使用できますが、目的にはLinkedHashSetを使用してください。
また、ドキュメントから、
「この実装は、TreeSetに関連するコストの増加を招くことなく、HashSetによって提供される不特定の、一般的に無秩序な順序付けからクライアントを保護します。元の形式に関係なく、元の形式と同じ順序を持つセットのコピーを作成するために使用できます。セットの実装:」
ソース:http : //docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
セットは単なるインターフェースです。順序を維持するには、そのインターフェースとサブインターフェースSortedSetの特定の実装、たとえばTreeSetやLinkedHashSetを使用する必要があります。このようにしてSetをラップできます:
Set myOrderedSet = new LinkedHashSet(mySet);
以下は、Set
Javaで利用可能な標準実装の順序特性の概要です。
特定のケースでは、最初にアイテムを並べ替えてから、1または2のいずれかを使用できます(最も可能性が高いLinkedHashSet
またはTreeSet
)。または、別の方法でより効率的に、自動的にソートを処理するにソートされていないデータを追加することもできTreeSet
ます。
注文を保持するには、List
またはを使用しLinkedHashSet
ます。
LinkedHashSet
、ではありません... Map
。
LinkedHashSetは、すべての要素にわたって二重にリンクされたリストを維持する、HashSetの順序付きバージョンです。反復順序を気にする場合は、HashSetの代わりにこのクラスを使用してください。
通常setは順序を維持しません。たとえば、すぐにemelentを見つけるためのHashSetですが、LinkedHashSetを試すと、入力した順序が維持されます。
Setインターフェース自体は、特定の順序を規定していません。ただし、SortedSetにはあります。
Setによって返されるイテレータは、データを順序どおりに返すことを想定していません。同じコレクションに対するこの2つのjava.util.Iteratorsを参照してください。同じ順序で要素を返す必要がありますか?