2012-03-30 10 views
6

はもちろん、セットは順序のいずれかの種類を持っていないので、私はセットの "toArray"は確定的ですか?

String[] string = mySet.toArray(); 

をすれば、私は任意の特定の順序を期待することはできませんしかし、私は、私は文字列の配列を注文する気にしないユースケースに直面していますであるが、私はその後、二組が等しい場合というケースのように、それが必要なのか:

StringUtils.join(mySet.toArray(),','); 

は関係なく、私が実行回数、常に、それらのセットのための同じ正確な文字列を生成しません私は同じコードに固執すると仮定してプログラム。

この保証はありますか?

同様に、イテレータ内の指定されたセットに対して要素が表示される順序については、この全体が真ですか?

+2

Anが脇: "Javaは" 頭字語ではありません。 – bernie

+1

セットは注文可能です。たとえば、TreeSetです。 – kukudas

+0

@kukudas私は真に "順序付けなし"がセットの事実上の要件の1つであると真剣に考えました。ありがとう! – Jeremy

答えて

4

技術的には、保証はありません。 Setはインターフェイスです。実装はさまざまであり、この要件を満たす場合としない場合があります。

セットから結果を抽出した後、自分で配列を並べ替えることで問題を引き起こします。

+0

ありがとうございます。すべての偉大な答え(それらのすべてをupvoted)しかし、これは明確な解決策を提供します。私は「問題を強制する」。 – Jeremy

7

通常、言及したようにSetの注文を保証することはできませんので、今でも動作しても、将来は無効になることがあります。ただし、の順番を保証するため、LinkedHashSetを使用することができます。これは、セットに要素が同じ順序で挿入されている場合にのみ機能します。そのような状況がなければ、おそらくセットをソートして印刷するだけです。

4

いいえ、絶対にありません。簡単な例では、考えてみます。

LinkedHashSet<String> set1 = new LinkedHashSet<String>(); 
set1.add("x"); 
set1.add("y"); 

LinkedHashSet<String> set2 = new LinkedHashSet<String>(); 
set2.add("y"); 
set2.add("x"); 

これらの二組が同じであるが、LinkedHashSetは、挿入順序を保持するので、彼らのイテレータは異なる順序で値を返すことが保証だ - と私は同じを持っているtoArrayを期待効果。

2

この保証はありません。 Set.toArray()のほとんどの実装では、同じセットの同じ順序が生成されると思われますが、ではには依存しない可能性があるため、この作業は常に表示されることがあります。

イテレータからの注文に依存することはできません。

セットは完全かつ完全に順序付けされていません。実装の振る舞いのために、一貫した順序のようなものを手に入れることができますが、これは決して信頼できるものではありません。

3

これは、Setの実装に完全に依存します。 Setはクラスではなくインターフェイスです。toArray()は、実装のイテレータと一致する必要があることを除いて、何も保証しません。 Set.toArray()のjavadocから

このセットは、反復子によって返される要素を注文するものに保証する場合、このメソッドは同じ順序で要素を返さなければなりません。

関連する問題