<String> Setini [] dizesine nasıl dönüştürebilirim?


281

Bir String[]dışarı çıkmak gerekir Set<String>, ama nasıl yapacağımı bilmiyorum. Aşağıdakiler başarısız olur:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

Çalışması için nasıl düzeltebilirim?


5
İle toArray()açıkça Javadoc belirtilen yönteme.
Lorne Marquis


Java 11: Yeni toArray()varsayılan yöntemi kullanma stackoverflow.com/a/32179686/1216775
akhil_mittal

Yanıtlar:


461

Set#toArray(T[])Aynı boyutta yazılan bir dizi bağımsız değişkeni alarak yöntemi kullanın .

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

Farklı bir boyut da kullanılabilir, ancak bu toArray(), sağlanan bağımsız değişkeni yeniden kullanmak yerine yeni bir dizi oluşturma yöntemini zorlar ve bu da daha az verimli olabilir.

Ayrıca kaynak kodunaAbstractCollection#toArray() bakın .


5
Ayrıca 0 beden dizisini de belirtebilirsiniz: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@sactiw: Bu zaten diğer cevap tarafından kapsanıyor. Bunun neden önerilmediğini diğer cevaptaki yorumu okuyun.
BalusC

8
Java 7'den kullanabiliriz String[] GPXFILES1 = myset.toArray(new String[0])ve bu önerilir. Cevabı güncelleyin. "OpenJDK 6'nın geç güncellemelerinden bu yana, boş çağrı sürümünün performansı, önceden boyutlandırılmış sürümle karşılaştırıldığında aynı ve bazen daha da iyi hale getirildiğinden bu çağrı içselleştirildi. toplama işlemi sırasında eşzamanlı olarak küçültülmüşse, boyut ve toArray çağrısı arasında dizinin sonunda fazladan boşluğa neden olabilecek bir veri yarışı mümkündür. " - java topluluğu tarafından alıntılanmıştır.
Chaitanya

6
Önce bu cevabı ve sonra daha fazla araştırma yaparak, yukarıdaki yorumun doğru olduğunu destekleyen bazı kanıtlar var; ve kabul edilen cevap güncel değil. Ne yapacağınıza ilişkin şu örnek bağlantıları alın: stackoverflow.com/questions/9863742/… ve bu SO post shipilev.net/blog/2016/arrays-wisdom-ancients adresinden bir bağlantı alın .
RMSD

60

Java 11

Arayüzdeki yeni varsayılan toArrayyöntem Collection, koleksiyon öğelerinin istenen çalışma zamanı türünde yeni oluşturulan bir diziye aktarılmasını sağlar. Bu alan IntFunction<T[]> generatorargüman olarak ve olarak kullanılabilir:

 String[] array = set.toArray(String[]::new);

Zaten benzer bir yöntem var Collection.toArray(T[])ve bu ekleme artık geçemeyeceğimiz anlamına geliyornull argüman olarak , çünkü bu durumda yönteme referans belirsiz olacaktır. Ancak her iki yöntem de bir NPE attığından hala iyi.

Java 8

Java 8'de akış API'sini kullanabiliriz:

String[] array = set.stream().toArray(String[]::new);

Ayrıca aşırı yüklü sürümü yararlanabilir ToArray () alır IntFunction<A[]> generatorgibidir:

String[] array = set.stream().toArray(n -> new String[n]);

Buradaki jeneratör fonksiyonunun amacı bir tamsayı (istenen dizinin boyutu) almak ve istenen boyutta bir dizi üretmektir. Ben şahsen metodu referans kullanarak önceki yaklaşımı lambda ifadesini kullanarak daha sonradan tercih ederim.


stream()kullanmanıza gerek yok toArray(). Olabilirset.toArray(new String[0])
Jakub Pomykała

1
@ JakubPomykała Bu aslında iyi değil. Yanlış boyutta bir dizi verdiğinizde, dahili olarak bu işlev bir dizi doğru boyut elde etmek için yansıma kullanmalıdır. Bu yönteme ihtiyaç duyulursa, bunu yapınset.toArray(new String[set.size()]);
Debosmit Ray

42

Kullanım toArray (T []: a) yöntemi:

String[] array = set.toArray(new String[0]);

26
ToArray () öğesine çok küçük boyutlu bir dizi ilettiğinizde, toArray () yönteminin yansıma kullanarak doğru boyutta yeni bir dizi oluşturması gerekir. Bu, en azından koleksiyonun kendisinin büyüklüğünde bir dizi geçirmekten çok daha kötü bir performansa sahiptir. Bu nedenle , kabul edilen cevaptaki [0]ile değiştirilmelidir [myset.size()].
k2col

10
@ k2col şimdi görünüyor set.toArray(new String[0])daha iyi bir performans varset.toArray(new String[set.size()]
Xam

1
Java 7'den beri tercih edilen yaklaşım budur. Bu yoruma bakın .
19:37, acdcjunior



1
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

0

Aynı durumla karşı karşıyaydım.

İhtiyacım olan yapıları ilan ederek başlıyorum:

Set<String> myKeysInSet = null; String[] myArrayOfString = null;

Benim durumumda, bir JSON nesnesi var ve ben bu JSON dizeleri bir dizi saklanacak tüm anahtarları gerekir. GSON kütüphanesini kullanarak, tuşları almak ve Setime geçmek için JSON.keySet () kullanıyorum:

myKeysInSet = json_any.keySet();

Bununla, tüm tuşları içeren bir Set yapısına ihtiyacım var. Bu yüzden sadece Dizeler Dizimi değerlerine ihtiyacım var. Aşağıdaki koda bakın:

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

Bu StackOverflow'daki ilk cevabımdı. Herhangi bir hata için özür dilerim: D

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.