web-dev-qa-db-ja.com

Java保持順序を設定しますか?

Java Setは順序を保持しますか?メソッドがSetを返し、データは順序付けられていると思われますが、Setを反復処理しているため、データは順序付けられていません。これを管理するより良い方法はありますか? Set以外の何かを返すには、メソッドを変更する必要がありますか?

144
user840930

Set インターフェースは、順序付けの保証を提供しません。

そのサブインターフェース SortedSet は、何らかの基準に従ってソートされたセットを表します。 Java 6には、SortedSetを実装する2つの標準コンテナがあります。 TreeSet および ConcurrentSkipListSet です。

SortedSetインターフェースに加えて、 LinkedHashSet クラスもあります。要素がセットに挿入された順序を記憶し、その順序で要素を返します。

209
NPE

LinkedHashSet が必要です。

80
xiaofeng.li

メンバーの多くが提案したようにLinkedHashSetを使用してコレクションの順序を保持します。 Uは、この実装を使用してセットをラップできます。

SortedSet実装はソートされた順序に使用できますが、目的に使用できますLinkedHashSet

また、ドキュメントから、

「この実装は、TreeSetに関連するコストの増加を招くことなく、HashSetによって提供される不特定で一般に混oticとした順序付けからクライアントを回避します。セットの実装:」

ソース: http://docs.Oracle.com/javase/6/docs/api/Java/util/LinkedHashSet.html

14
Lakshman

Setは単なるインターフェースです。順序を保持するには、そのインターフェイスとサブインターフェイスSortedSetの特定の実装(TreeSetやLinkedHashSetなど)を使用する必要があります。 Setは次の方法でラップできます。

Set myOrderedSet = new LinkedHashSet(mySet);
8
javatutorial

順序を保持するには、ListまたはLinkedHashSetを使用します。

8
JHS

Javaで使用可能な標準のSet実装の順序特性の概要を以下に示します。

  1. 挿入順序を維持: LinkedHashSet および CopyOnWriteArraySet (スレッドセーフ)
  2. セット内で項目をソートしたままにします。 TreeSetEnumSet (列挙に固有)、および ConcurrentSkipListSet (スレッドセーフ)
  3. 特定の順序でアイテムを保持しません: HashSet (試したもの)

特定のケースでは、最初に項目をソートしてから、1または2のいずれかを使用できます(ほとんどの場合、LinkedHashSetまたはTreeSet)。または、より効率的に、ソートされていないデータをTreeSetに追加するだけで、ソートが自動的に処理されます。

6
assylias

Set.iterator()のjavadocから:

このセットの要素の反復子を返します。要素は特定の順序で返されません(このセットが保証を提供するクラスのインスタンスでない限り)。

そして、 shuuchan で既に述べたように、TreeSetは、順序が保証されたSetの実装です:

要素は、使用されるコンストラクタに応じて、自然な順序を使用して、またはセットの作成時に提供されるコンパレータによって順序付けされます。

3
hmjd

通常、setはエメレントをすばやく見つけるためにHashSetなどの順序を維持しませんが、LinkedHashSetを試して、入力した順序を維持できます。

3
user1335794

LinkedHashSetは、すべての要素にわたって二重にリンクされたリストを維持するHashSetの順序付きバージョンです。反復順序を気にするときは、HashSetの代わりにこのクラスを使用します。

3

Setインターフェース自体は、特定の順序を規定していません。ただし、 SortedSet は実行します。

0
Jens Borgland

Setによって返されるイテレータは、順序付きでデータを返すことを想定していません。これを参照してください 同じコレクションへの2つのJava.util.Iterators:同じ順序で要素を返す必要がありますか?

0
ejb_guy