Ini mungkin agak mudah, semacam pertanyaan utama, tetapi upaya pertama saya secara mengejutkan gagal total. Saya ingin mengambil deretan panjang primitif dan mengubahnya menjadi daftar, yang saya coba lakukan seperti ini:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
Apa cara yang benar untuk melakukan ini?
java
arrays
collections
boxing
Brandon Yarbrough
sumber
sumber
Jawaban:
Saya merasa nyaman untuk melakukan menggunakan apache commons lang ArrayUtils ( javadoc , Maven ketergantungan )
itu juga memiliki API terbalik
EDIT: diperbarui untuk memberikan konversi lengkap ke daftar seperti yang disarankan oleh komentar dan perbaikan lainnya.
sumber
Arrays.asList(ArrayUtils.toObject(input))
.List<Long> = Arrays.asList(inputBoxed)
dalam pertanyaan mereka, saya merasa berlebihan untuk mengulanginya karena saya pikir itu sudah jelas, saya kira saya salah ...Karena Java 8 sekarang Anda dapat menggunakan stream untuk itu:
sumber
stream
fungsi ini hanya ditentukan untukint[]
,long[]
dandouble[]
.LongStream.of(arr).boxed()...
.Arrays.stream(arr).boxed().collect(Collectors.toList());
Sayangnya ini hanya dapat kembaliList<Object>
sumber
hallidave dan jpalecek memiliki ide yang tepat — iterasi di atas array — tetapi mereka tidak memanfaatkan fitur yang disediakan oleh
ArrayList
: karena ukuran daftar diketahui dalam kasus ini, Anda harus menentukannya saat membuatArrayList
.Dengan cara ini, tidak ada array yang tidak perlu dibuat hanya untuk dibuang oleh
ArrayList
karena mereka ternyata terlalu pendek, dan tidak ada "slot" kosong yang terbuang karenaArrayList
terlalu tinggi kebutuhan ruangnya. Tentu saja, jika Anda terus menambahkan elemen ke daftar, array dukungan baru akan diperlukan.sumber
Sedikit lebih bertele-tele, tetapi ini berfungsi:
Dalam contoh Anda, terlihat bahwa Array.asList () menafsirkan input sebagai daftar array panjang [] alih-alih daftar Long. Agak mengejutkan, pasti. Autoboxing tidak berfungsi seperti yang Anda inginkan dalam hal ini.
sumber
Sebagai kemungkinan lain, perpustakaan Guava menyediakan ini sebagai
Longs.asList()
, dengan kelas utilitas serupa untuk tipe primitif lainnya.sumber
Tidak, tidak ada konversi otomatis dari array tipe primitif ke array tipe referensi kotaknya. Anda hanya bisa melakukannya
sumber
Pertanyaan yang diajukan tentang cara mengubah array menjadi daftar. Sebagian besar jawaban sejauh ini menunjukkan cara membuat daftar baru dengan konten yang sama dengan array, atau merujuk ke perpustakaan pihak ketiga. Namun, ada opsi sederhana dan bawaan untuk konversi semacam ini. Beberapa dari mereka sudah dibuat sketsa di jawaban lain (misalnya yang ini ). Tetapi saya ingin menunjukkan dan menguraikan derajat kebebasan tertentu untuk implementasi di sini, dan menunjukkan potensi manfaat, kelemahan, dan peringatan.
Setidaknya ada dua perbedaan penting yang harus dibuat:
Opsi akan diringkas di sini dengan cepat, dan program contoh lengkap ditampilkan di bagian bawah jawaban ini.
Membuat daftar baru versus membuat tampilan pada array
Ketika hasilnya harus menjadi daftar baru , maka salah satu pendekatan dari jawaban lain dapat digunakan:
Tetapi orang harus mempertimbangkan kelemahan dari melakukan ini: Sebuah array dengan
long
nilai 1000000 akan menempati sekitar 8 Megabytes memori. Daftar baru juga akan menempati kira-kira 8 Megabita. Dan tentu saja, array lengkap harus dilalui saat membuat daftar ini. Dalam banyak kasus, membuat daftar baru sama sekali tidak perlu. Sebagai gantinya, cukup membuat tampilan pada array:(Lihat contoh di bawah untuk implementasi
toList
metode ini)Implikasi memiliki tampilan pada array adalah bahwa perubahan dalam array akan terlihat dalam daftar:
Untungnya, membuat salinan (yaitu, daftar baru yang tidak terpengaruh oleh modifikasi dalam array) dari tampilan sepele:
Sekarang, ini adalah salinan yang benar, setara dengan apa yang dicapai dengan solusi berbasis aliran yang ditunjukkan di atas.
Membuat dimodifikasi pandangan atau unmodifiable tampilan
Dalam banyak kasus, itu akan cukup ketika daftar hanya-baca . Isi daftar yang dihasilkan sering tidak akan diubah, tetapi hanya diteruskan ke pemrosesan hilir yang hanya membaca daftar.
Mengizinkan modifikasi daftar menimbulkan beberapa pertanyaan:
Dimungkinkan untuk membuat tampilan daftar pada array yang dapat dimodifikasi . Ini berarti bahwa perubahan dalam daftar, seperti pengaturan nilai baru pada indeks tertentu, akan terlihat dalam array.
Tetapi tidak mungkin untuk membuat tampilan daftar yang dapat dimodifikasi secara struktural . Ini berarti bahwa tidak mungkin melakukan operasi yang memengaruhi ukuran daftar. Ini hanya karena ukuran array yang mendasarinya tidak dapat diubah.
Berikut ini adalah MCVE yang menunjukkan opsi implementasi yang berbeda, dan kemungkinan cara menggunakan daftar yang dihasilkan:
Output dari contoh ditunjukkan di sini:
sumber
Cara lain dengan Java 8.
sumber
Saya sedang menulis perpustakaan kecil untuk masalah ini:
Jika Anda ingin memeriksanya di sini .
sumber
Lain cara dengan Java 8.
sumber
Arrays.stream(a).boxed().collect(Collectors.<Long>toList());
Menggabungkan jawaban Pavel dan Tom kita dapatkan ini
sumber
Jika Anda ingin semantik serupa
Arrays.asList
maka Anda harus menulis (atau menggunakan implementasi orang lain) dariList
(mungkin melaluiAbstractList
. Ini harus memiliki banyak implementasi yang sama sepertiArrays.asList
, hanya nilai kotak dan unbox.sumber
Anda dapat menggunakan transmorph :
Ini juga berfungsi jika sumber adalah array int misalnya.
sumber
Saya tahu pertanyaan ini sudah cukup lama, tetapi ... Anda juga dapat menulis metode konversi sendiri:
Setelah Anda memasukkannya menggunakan impor statis, kemungkinan penggunaan dapat:
atau
sumber
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
Anda adalah orang yang mengerikan.Meskipun dimungkinkan untuk membuat Daftar baru dan menambahkan semua nilai ke dalamnya (via for loop atau stream), saya telah bekerja pada array yang sangat besar dan mendapatkan kinerja yang buruk. Oleh karena itu saya membuat kelas pembungkus array primitif saya sendiri yang mudah digunakan.
Contoh:
Dapatkan di sini: https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java
CATATAN: Saya belum sepenuhnya mengujinya, jadi beri tahu saya jika Anda menemukan bug / masalah.
sumber
Anda bisa menggunakannya
LongStream
untuk itusumber