Saya ingin mengonversi array ke Set di Java. Ada beberapa cara yang jelas untuk melakukan ini (yaitu dengan loop) tetapi saya ingin sesuatu yang sedikit lebih rapi, seperti:
java.util.Arrays.asList(Object[] a);
Ada ide?
java
collections
arrays
set
Bob Gilmore
sumber
sumber
Arrays.asList
adalah O (1).Itu adalah Collections.addAll (java.util.Collection, T ...) dari JDK 6.
Selain itu: bagaimana jika array kami penuh dengan primitif?
Untuk JDK <8, saya hanya akan menulis
for
loop yang jelas untuk melakukan wrap dan add-to-set dalam satu pass.Untuk JDK> = 8, opsi yang menarik adalah sesuatu seperti:
sumber
java.util.Collections.addAll
. Plus, saya tidak akan merekomendasikan Commons Collections lagi, apa yang tidak dibuat dan Guava adaaddAll
akan menjadi O ( n ).Dengan Jambu Biji, Anda bisa melakukannya:
sumber
new HashSet<T>(Arrays.asList(someArray))
. Lihat google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
sumber
Varargs akan bekerja juga!
sumber
Java 8
Kami memiliki opsi untuk menggunakan
Stream
juga. Kita bisa mendapatkan streaming dengan berbagai cara:Kode sumber
Collectors.toSet()
menunjukkan bahwa elemen ditambahkan satu per satu keHashSet
tetapi spesifikasi tidak menjamin itu akan menjadiHashSet
.Jadi lebih baik menggunakan opsi nanti. Outputnya adalah:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Set Abadi (Java 9)
Java 9 memperkenalkan
Set.of
metode pabrik statis yang mengembalikan set tetap untuk elemen yang disediakan atau array.Periksa Metode Pabrik Statis Tidak Berubah untuk detailnya.
Set Abadi (Java 10)
Kita juga bisa mendapatkan perangkat permanen dengan dua cara:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
Metode ini secara
Collectors.toUnmodifiableList()
internal menggunakanSet.of
diperkenalkan di Jawa 9. Juga periksa jawaban saya ini untuk lebih.sumber
Stream.of()
- Saya tidak tahu itu. Sebuah pertengkaran kecil tentangCollectors.toSet()
: Anda mengatakan spec tidak menjamin penambahan elemen satu per satu, tapi itulah artinya dengan: "mengakumulasi ... menjadi yang baruSet
". Dan itu lebih mudah dibaca - jadi lebih disukai bagi saya, jika Anda tidak memerlukan jaminan jenis konkret, mutabilitas, serializability dan keamanan thread.HashSet
. Itu hanya menjamin bahwa itu akan menjadiSet
dan itu yang saya maksud. Semoga saya klarifikasi.Setelah Anda melakukannya,
Arrays.asList(array)
Anda dapat menjalankanSet set = new HashSet(list);
Berikut adalah contoh metode, Anda dapat menulis:
sumber
Di Eclipse Collections , yang berikut ini akan berfungsi:
Catatan: Saya pengendara untuk Eclipse Collections
sumber
Dengan cepat: Anda dapat melakukan:
dan untuk membalikkan
sumber
Saya telah menulis di bawah ini dari saran di atas - mencurinya ... itu bagus!
sumber
Telah ada banyak jawaban yang besar sudah, tapi kebanyakan dari mereka tidak akan bekerja dengan array primitif (seperti
int[]
,long[]
,char[]
,byte[]
, dll)Di Java 8 dan di atas, Anda bisa mengotak array dengan:
Kemudian konversi untuk diatur menggunakan aliran:
sumber
Kadang menggunakan beberapa perpustakaan standar banyak membantu. Cobalah untuk melihat Koleksi Apache Commons . Dalam hal ini masalah Anda hanya ditransformasikan menjadi sesuatu seperti ini
Dan di sini adalah javadoc CollectionsUtils
sumber
java.util.Collections.addAll(myEmptySet, keys);
??Gunakan
CollectionUtils
atauArrayUtils
daristanford-postagger-3.0.jar
sumber
Di Jawa 10 :
Set.copyOf
mengembalikan yang tidak dapat dimodifikasi yangSet
mengandung unsur-unsur yang diberikanCollection
.Yang diberikan
Collection
tidak bolehnull
, dan tidak boleh mengandungnull
elemen apa pun .sumber
outputnya adalah
ubah ke
outputnya adalah
sumber
Bagi siapa pun yang memecahkan untuk Android:
Solusi Koleksi Kotlin
Tanda bintang
*
adalahspread
operator. Itu berlaku semua elemen dalam koleksi secara individual, masing-masing diteruskan untukvararg
parameter metode. Itu sama dengan:Melewati tanpa parameter
setOf()
menghasilkan set kosong.Selain itu
setOf
, Anda juga dapat menggunakan semua ini untuk jenis hash tertentu:Ini adalah cara mendefinisikan jenis item koleksi secara eksplisit.
sumber
new HashSet<Object>(Arrays.asList(Object[] a));
Tapi saya pikir ini akan lebih efisien:
sumber
HashSet
diatur berdasarkan ukuran array, misalnya.sumber