Java Setは順序を保持しますか?メソッドがSetを返し、データは順序付けられていると思われますが、Setを反復処理しているため、データは順序付けられていません。これを管理するより良い方法はありますか? Set以外の何かを返すには、メソッドを変更する必要がありますか?
Set
インターフェースは、順序付けの保証を提供しません。
そのサブインターフェース SortedSet
は、何らかの基準に従ってソートされたセットを表します。 Java 6には、SortedSet
を実装する2つの標準コンテナがあります。 TreeSet
および ConcurrentSkipListSet
です。
SortedSet
インターフェースに加えて、 LinkedHashSet
クラスもあります。要素がセットに挿入された順序を記憶し、その順序で要素を返します。
LinkedHashSet が必要です。
メンバーの多くが提案したようにLinkedHashSetを使用してコレクションの順序を保持します。 Uは、この実装を使用してセットをラップできます。
SortedSet実装はソートされた順序に使用できますが、目的に使用できますLinkedHashSet 。
また、ドキュメントから、
「この実装は、TreeSetに関連するコストの増加を招くことなく、HashSetによって提供される不特定で一般に混oticとした順序付けからクライアントを回避します。セットの実装:」
ソース: http://docs.Oracle.com/javase/6/docs/api/Java/util/LinkedHashSet.html
Setは単なるインターフェースです。順序を保持するには、そのインターフェイスとサブインターフェイスSortedSetの特定の実装(TreeSetやLinkedHashSetなど)を使用する必要があります。 Setは次の方法でラップできます。
Set myOrderedSet = new LinkedHashSet(mySet);
順序を保持するには、List
またはLinkedHashSet
を使用します。
Javaで使用可能な標準のSet
実装の順序特性の概要を以下に示します。
特定のケースでは、最初に項目をソートしてから、1または2のいずれかを使用できます(ほとんどの場合、LinkedHashSet
またはTreeSet
)。または、より効率的に、ソートされていないデータをTreeSet
に追加するだけで、ソートが自動的に処理されます。
Set.iterator()
のjavadocから:
このセットの要素の反復子を返します。要素は特定の順序で返されません(このセットが保証を提供するクラスのインスタンスでない限り)。
そして、 shuuchan で既に述べたように、TreeSet
は、順序が保証されたSet
の実装です:
要素は、使用されるコンストラクタに応じて、自然な順序を使用して、またはセットの作成時に提供されるコンパレータによって順序付けされます。
通常、setはエメレントをすばやく見つけるためにHashSetなどの順序を維持しませんが、LinkedHashSetを試して、入力した順序を維持できます。
LinkedHashSetは、すべての要素にわたって二重にリンクされたリストを維持するHashSetの順序付きバージョンです。反復順序を気にするときは、HashSetの代わりにこのクラスを使用します。
Setインターフェース自体は、特定の順序を規定していません。ただし、 SortedSet は実行します。
Setによって返されるイテレータは、順序付きでデータを返すことを想定していません。これを参照してください 同じコレクションへの2つのJava.util.Iterators:同じ順序で要素を返す必要がありますか?