Bagaimana cara mengubah Set <String> ke String []?


281

Saya perlu String[]keluar dari Set<String>, tapi saya tidak tahu bagaimana melakukannya. Berikut ini gagal:

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

Bagaimana saya bisa memperbaikinya agar berfungsi?


5
Dengan toArray()metode yang jelas disebutkan dalam Javadoc.
Marquis of Lorne


Java 11: Menggunakan toArray()metode default baru stackoverflow.com/a/32179686/1216775
akhil_mittal

Jawaban:


461

Gunakan Set#toArray(T[])metode mengambil argumen array yang diketik dengan ukuran yang sama.

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

Ukuran yang berbeda juga dapat digunakan, tetapi itu akan memaksa toArray()metode untuk membuat array baru untuk kembali daripada menggunakan kembali argumen yang disediakan, yang mungkin berakhir menjadi kurang efisien.

Lihat juga kode sumberAbstractCollection#toArray() .


5
Anda juga dapat menentukan larik ukuran 0: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@sactiw: Itu sudah dibahas oleh jawaban lain. Baca komentar pada jawaban lain mengapa ini tidak dianjurkan.
BalusC

8
Dari Java 7 kita bisa menggunakan String[] GPXFILES1 = myset.toArray(new String[0])dan itu direkomendasikan. Perbarui jawabannya. "Karena pembaruan OpenJDK 6 yang terlambat, panggilan ini diintinsinsifkan, menjadikan kinerja versi array kosong sama dan terkadang bahkan lebih baik, dibandingkan dengan versi pra-ukuran. Selain itu, melewati array ukuran pra-berbahaya untuk koleksi bersamaan atau disinkronkan sebagai perlombaan data dimungkinkan antara ukuran dan panggilan toArray yang dapat menghasilkan nulls ekstra di akhir array, jika koleksi secara bersamaan menyusut selama operasi. " - Dikutip oleh komunitas java.
Chaitanya

6
Menghadapi jawaban ini terlebih dahulu dan kemudian melakukan penelitian lebih lanjut, ada beberapa bukti yang mendukung bahwa komentar di atas benar; dan jawaban yang diterima sudah usang. Ambil contoh tautan ini untuk apa yang Anda inginkan: stackoverflow.com/questions/9863742/… , dan tautan dari SO post itu shipilev.net/blog/2016/arrays-wisdom-ancients .
RMSD

60

Jawa 11

toArrayMetode default baru di Collectionantarmuka memungkinkan elemen koleksi ditransfer ke array yang baru dibuat dari tipe runtime yang diinginkan. Ini mengambil IntFunction<T[]> generatorsebagai argumen dan dapat digunakan sebagai:

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

Sudah ada metode yang serupa Collection.toArray(T[])dan penambahan ini berarti kita tidak lagi dapat lulus nullsebagai argumen karena dalam kasus itu referensi ke metode akan ambigu. Tapi tetap saja tidak apa-apa karena kedua metode melemparkan NPE.

Java 8

Di Java 8 kita bisa menggunakan stream API:

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

Kami juga dapat menggunakan versi toArray () yang kelebihan beban IntFunction<A[]> generatordengan:

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

Tujuan fungsi generator di sini adalah untuk mengambil integer (ukuran array yang diinginkan) dan menghasilkan array ukuran yang diinginkan. Saya pribadi lebih suka pendekatan yang pertama menggunakan referensi metode daripada yang belakangan menggunakan ekspresi lambda.


Anda tidak perlu stream()menggunakan toArray(). Itu bisaset.toArray(new String[0])
Jakub Pomykała

1
@ JakubPomykała Itu sebenarnya tidak baik. Ketika Anda memberikan array dengan ukuran yang salah, secara internal fungsi tersebut harus menggunakan refleksi untuk mendapatkan ukuran array yang benar. Jika metode ini diperlukan, lakukan sajaset.toArray(new String[set.size()]);
Debosmit Ray

42

Gunakan metode toArray (T [] a) :

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

26
Ketika Anda melewatkan toArray () array dengan ukuran terlalu kecil, metode toArray () harus membuat array baru dengan ukuran yang tepat menggunakan refleksi. Ini memiliki kinerja yang jauh lebih buruk daripada melewati dalam array setidaknya ukuran koleksi itu sendiri. Karena itu [0]harus diganti dengan [myset.size()]seperti pada jawaban yang diterima.
k2col

10
@ k2col tampaknya sekarang set.toArray(new String[0])memiliki kinerja yang lebih baik daripadaset.toArray(new String[set.size()]
Xam

1
Karena Java 7 ini adalah pendekatan yang disukai. Lihat komentar ini .
acdcjunior



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

0

Saya menghadapi situasi yang sama.

Saya mulai dengan mendeklarasikan struktur yang saya butuhkan:

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

Dalam kasus saya, saya memiliki objek JSON dan saya membutuhkan semua kunci di JSON ini untuk disimpan dalam array string. Menggunakan perpustakaan GSON, saya menggunakan JSON.keySet () untuk mendapatkan kunci dan pindah ke Set saya:

myKeysInSet = json_any.keySet();

Dengan ini, saya memiliki struktur Set dengan semua kunci, seperti yang saya butuhkan. Jadi saya hanya perlu nilai untuk Array of Strings saya. Lihat kode di bawah ini:

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

Ini adalah jawaban pertama saya di StackOverflow. Maaf atas kesalahan apa pun: D

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.