Bagaimana cara mengkonversi array untuk daftar di Jawa?
Saya menggunakan Array.sebagai daftar()
tetapi perilaku (dan tanda tangan) entah bagaimana berubah dari Java SE 1.4.2 (docs sekarang di arsip) untuk 8 dan sebagian besar potongan yang saya temukan di web menggunakan 1.4.2 mendatang.
Misalnya:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
Dalam banyak kasus, itu harus mudah untuk mendeteksi, tapi kadang-kadang hal ini dapat menyelinap tanpa diketahui:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
Dalam contoh anda, itu karena anda dapat't memiliki Daftar dari tipe primitif. Dengan kata lain, Daftar<int>
tidak mungkin.
Namun, anda dapat memiliki Daftar<Integer>
menggunakan bilangan Bulat
kelas yang membungkus int
primitif. Mengkonversi array klik disini
dengan Arrays.asList
utilitas metode.
Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);
Melihat ini kode menjalankan hidup di IdeOne.com.
Berbicara tentang konversi way, itu tergantung pada mengapa anda perlu anda Daftar
.
Jika yang anda butuhkan hanya untuk membaca data. OK, di sini anda pergi:
Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);
Tapi kemudian jika anda melakukan sesuatu seperti ini:
list.add(1);
anda mendapatkan jawa.lang.UnsupportedOperationException
.
Jadi untuk beberapa kasus, anda bahkan tidak perlu ini:
Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));
Pendekatan pertama benar-benar tidak mengkonversi array tapi 'merupakan' itu seperti sebuah Daftar
. Tapi hotel yang berada di bawah tenda dengan semua sifat-sifatnya tetap seperti jumlah elemen. Harap dicatat anda harus menentukan jenis ketika membangun ArrayList
.
Masalahnya adalah bahwa varargs punya diperkenalkan di Java5 dan sayangnya, Array.sebagai daftar()
punya kelebihan beban dengan vararg versi juga. Jadi Array.sebagai daftar(spam)
dipahami oleh Java5 compiler sebagai vararg parameter int array.
Masalah ini dijelaskan secara lebih detail secara Efektif Jawa 2nd Ed., Bab 7, 42 Item.
Tampaknya sedikit terlambat tapi di sini ada dua sen. Kita tidak bisa memiliki Daftar<int>
sebagai int
adalah tipe primitif sehingga kita hanya bisa memiliki Daftar<Integer>
.
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
Dalam kasus kami ingin implementasi khusus dari Daftar
misalnya ArrayList
maka kita dapat menggunakan toCollection
sebagai:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
Mengapa list21
tidak dapat secara struktural diubah?
Ketika kita menggunakan Array.sebagai daftar
ukuran daftar kembali diperbaiki karena daftar kembali tidak jawa.util.ArrayList
, tapi pribadi statis kelas didefinisikan dalam jawa.util.Array
. Jadi jika kita menambah atau menghapus elemen dari daftar kembali, sebuah UnsupportedOperationException
akan dilemparkan. Jadi kita harus pergi dengan list22
ketika kita ingin mengubah daftar. Jika kita memiliki Java8 maka kita juga bisa pergi dengan list23
.
Untuk menjadi jelas list21
dapat dimodifikasi dalam arti bahwa kita dapat memanggil list21.set(indeks elemen)
tetapi daftar ini mungkin tidak secara struktural dimodifikasi yaitu tidak dapat menambahkan atau menghapus elemen dari daftar. Anda juga dapat memeriksa ini pertanyaan.
Jika kita ingin berubah daftar maka kita bisa membungkusnya sebagai:
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
Hal lain yang perlu diperhatikan adalah bahwa metode Koleksi.unmodifiableList
kembali unmodifiable lihat dari daftar yang ditentukan. Sebuah unmodifiable melihat koleksi koleksi yang unmodifiable dan juga pandangan ke sebuah backing koleksi. Perhatikan bahwa perubahan backing koleksi mungkin masih mungkin, dan jika mereka terjadi, mereka terlihat melalui unmodifiable lihat.
Kita bisa benar-benar berubah daftar di pulau Jawa 10.
Daftar.copyOf(Array.sebagai daftar(bilangan bulat))
Array.aliran(bilangan bulat).mengumpulkan(Kolektor.toUnmodifiableList());
Juga memeriksa ini jawaban tambang untuk lebih lanjut.
Saya baru-baru ini untuk mengkonversi array untuk Daftar. Kemudian pada program disaring daftar mencoba untuk menghapus data. Ketika anda menggunakan Array.sebagai daftar(array) fungsi, anda membuat ukuran tetap collection: anda tidak dapat menambahkan atau menghapus. Entri ini menjelaskan masalah lebih baik daripada yang saya dapat: https://stackoverflow.com/questions/2965747/why-i-get-unsupportedoperationexception-when-trying-to-remove-from-the-list.
Pada akhirnya, saya harus melakukan "manual" konversi:
List<ListItem> items = new ArrayList<ListItem>();
for (ListItem item: itemsArray) {
items.add(item);
}
Saya kira saya bisa menambahkan konversi dari array untuk daftar menggunakan Daftar.addAll(item) operasi.
Ini adalah cara paling sederhana untuk mengkonversi array ke Daftar
. Namun, jika anda mencoba untuk menambahkan elemen baru atau menghapus yang sudah ada elemen dari daftar, sebuah UnsupportedOperationException
akan dilemparkan.
Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);
// WARNING:
list2.add(1); // Unsupported operation!
list2.remove(1); // Unsupported operation!
Anda dapat menggunakan untuk
loop untuk menambahkan semua elemen array ke Daftar
pelaksanaan, misal ArrayList
:
List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
list.add(i);
}
Anda dapat mengubah array menjadi sebuah aliran, kemudian mengumpulkan streaming menggunakan kolektor yang berbeda: default collector di Jawa 8 menggunakan ArrayList
di balik layar, tetapi anda juga dapat memaksakan pilihan anda pelaksanaannya.
List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));
Lihat juga:
Di Jawa 9 anda memiliki bahkan solusi yang lebih elegan menggunakan langgeng daftar melalui new kemudahan metode pabrik klik disini.dari
:
List<String> immutableList = List.of("one","two","three");
(tanpa malu-malu disalin dari di sini )
Jika anda menargetkan Jawa 8 (atau lebih), anda dapat mencoba ini:
int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
.boxed().collect(Collectors.<Integer>toList());
CATATAN:
Memperhatikan Kolektor.<Integer>kedaftar()
, ini metode generik membantu anda untuk menghindari kesalahan "Type mismatch: tidak dapat mengubah dari Daftar<Objek>
untuk `Daftar
Integer[] array = { 1, 2, 3};
Daftar
Integer[] array = { 1, 2, 3};
Daftar
Jika ini bisa membantu: I've punya masalah yang sama dan hanya menulis fungsi generik yang mengambil array dan mengembalikan ArrayList dari jenis yang sama dengan isi yang sama:
public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
ArrayList<T> list = new ArrayList<T>();
for(T elmt : array) list.add(elmt);
return list;
}
Diberikan Array:
int[] givenArray = {2,2,3,3,4,5};
Mengkonversi array integer untuk bilangan Bulat klik disini
Salah satu cara: kotak() -> mengembalikan IntStream
List<Integer> givenIntArray1 = Arrays.stream(givenArray)
.boxed()
.collect(Collectors.toList());
Cara kedua: peta masing-masing elemen dari sungai ke Integer dan kemudian mengumpulkan
CATATAN: Menggunakan mapToObj anda dapat rahasia masing-masing int elemen ke string stream, char stream dll dengan casing i (char)i
List<Integer> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->i)
.collect(Collectors.toList());
Mengkonversi Satu array tipe ke Tipe yang Lain Contoh:
List<Character> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->(char)i)
.collect(Collectors.toList());
Jadi itu tergantung pada yang versi Java anda mencoba-
Arrays.asList(1, 2, 3);
ATAU
final String arr[] = new String[] { "G", "E", "E", "K" };
final List<String> initialList = new ArrayList<String>() {{
add("C");
add("O");
add("D");
add("I");
add("N");
}};
// Elements of the array are appended at the end
Collections.addAll(initialList, arr);
ATAU
Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);
int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
.boxed().collect(Collectors.<Integer>toList())
Referensi - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/