2012-03-30 10 views
6

Açıkçası, setleri sıralamasının herhangi tür yok, bu yüzden Ancak, ben kullanma dosyası ile karşı karşıya amBir kümenin "toArray" determinist mi?

String[] string = mySet.toArray(); 

yaparsanız ben dize dizisi sipariş umurumda değil nerede herhangi bir özel sipariş bekleyemezsiniz olduğunu, ama iki kümeleri birbirine eşitse bu durumda olması gerek DO:

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

olursa olsun çalıştırmak kaç kez, her zaman, kümelerine ilişkin aynı dizeyi üretecek Program aynı kodla bağlı olduğumu varsayar.

Bu garantiye sahip miyim?

Benzer şekilde, bir yineleyicide belirli bir Set için öğelerin göründüğü düzen için bu durum geçerli midir?

+2

bir kenara: "Java" bir kısaltma değildir. – bernie

+1

Set'in bir siparişi olabilir. Örneğin TreeSet. – kukudas

+0

Kukudas Ben gerçekten "hiçbir sipariş" bir setin fiili gereksinimleri biri olduğunu düşündüm. Teşekkürler! – Jeremy

cevap

4

Teknik olarak, hiç bir garantiniz yok. Set bir Arabirimdir. Uygulamalar değişecektir ve bu gerekliliğe uyabilir veya olmayabilir.

Kümeyi, sonuçları Set'ten ayıkladıktan sonra sıralayarak kendiniz ayırın.

+0

Teşekkürler. Buradaki tüm büyük cevaplar (hepsini destekledi) ama bu açık bir çözüm sunuyor. Ben sorunu zorlayacağım. – Jeremy

7

Genel olarak, bir Set sırasının sırasını garanti edemezsiniz, çünkü şimdi çalışıyor olsa bile, gelecekte olmayabilir. Ancak, , numaralı telefonu LinkedHashSet numaralı ürüne garanti edebilirsiniz, böylece bunu kullanabilirsiniz. Bu sadece kümelerin, öğelerin aynı sırayla yerleştirilmiş olması durumunda çalışır. Bu duruma sahip değilseniz, muhtemelen kümeyi sıralamak ve yazdırmak zorundasınız.

4

Hayır, kesinlikle değil. önemsiz Örneğin, göz önünde bulundurun:

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

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

Bu iki set eşittir ancak LinkedHashSet ekleme talimatını korur çünkü onların yinelemeler farklı sırayla değerleri dönecektir olacağının hiçbir garantisi yoktur - ve aynı olmasını toArray beklediğiniz Efekt.

2

Bu garantiniz yok. Bu çalışmayı her zaman görebiliyor olabilirsiniz, çünkü çoğu uygulamanın Set.toArray()'un eşit kümeler için aynı siparişi üreteceğinden şüpheleniyorum, ancak siz 'un ürününe güvenemeyebilirsiniz.

Siparişi bir yineleyiciden de alamazsınız.

Takımlar tamamen ve tamamen sırasız. Uygulama davranışından dolayı, bunlardan tutarlı bir düzen gibi görünen bir şey elde edebilirsiniz, ancak bu herhangi bir şekilde güvenilmez.

3

Bu, Set uygulamasına tamamen bağımlı olacaktır. Set, bir sınıf değil, bir sınıftır ve toArray(), uygulamanın yineleyicisi ile eşleşmesi dışında bir şey garanti etmez. Set.toArray() için javadoc itibaren

:

bu seti de yineleyici tarafından döndürülen kendi elemanlarını sipariş ne olarak herhangi bir garanti vermez, bu yöntem aynı sırada unsurları geri dönmelidir.