205

Java Set は順序を保持しますか? メソッドが私にセットを返しています。おそらくデータは順序付けられていますが、セットを反復すると、データは順序付けられていません。これを管理するより良い方法はありますか?セット以外のものを返すようにメソッドを変更する必要がありますか?

4

13 に答える 13

298

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

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

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

于 2012-05-25T10:30:12.337 に答える
123

LinkedHashSetが必要です。

于 2012-05-25T10:29:20.463 に答える
12

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

Set myOrderedSet = new LinkedHashSet(mySet);
于 2012-05-25T10:29:45.257 に答える
8

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

于 2012-05-25T10:31:04.067 に答える
7

Set以下は、 Java で利用可能な標準実装の順序特性の簡単な要約です。

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

特定のケースでは、最初に項目を並べ替えてから、1 または 2 のいずれかを使用できます (ほとんどのLinkedHashSet場合 またはTreeSet)。または、代わりに、より効率的TreeSetに、並べ替えを自動的に処理する並べ替えられていないデータを に追加することもできます。

于 2012-05-25T10:36:00.710 に答える
3

のjavadocからSet.iterator()

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

そして、すでにshuuchanで述べられているように、 aは保証された順序を持つTreeSetの実装です:Set

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

于 2012-05-25T10:30:11.440 に答える
3

通常、HashSet のようにエメレントをすばやく見つけるために set は順序を保持しませんが、LinkedHashSet を試すと、入力した順序が保持されます。

于 2012-05-25T10:30:44.253 に答える
0

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

于 2012-05-25T10:30:58.030 に答える
0

Set によって返される Iterator は、Ordered の方法でデータを返すことは想定されていません。これを参照してください同じコレクションへの2つのjava.util.Iterators: do they have to return elements in the same order?

于 2012-05-25T10:31:46.750 に答える
-2

SortedSetの注文のみを行うことができますSet

于 2012-05-25T10:33:15.340 に答える