JavaRush /Java Blog /Random-ID /Daftar Java ke array: mengubah daftar elemen menjadi arra...
Анзор Кармов
Level 31
Санкт-Петербург

Daftar Java ke array: mengubah daftar elemen menjadi array

Dipublikasikan di grup Random-ID
Halo! Pada artikel ini, kita akan melihat cara mengubah daftar elemen menjadi array elemen di Java. Sebenarnya cara untuk melakukan ini tidak banyak, dan semuanya sederhana, sehingga artikelnya tidak akan ribet. Daftar Java ke array: mengubah daftar elemen menjadi array - 1Mari kita segera putuskan apa yang sedang kita kerjakan. Kami akan mengubah daftar menjadi array, dan lebih khusus lagi, daftar string: I, love, learning, on, JavaRush akan diubah menjadi array dengan string yang sama. Tapi pertama-tama, sedikit bonus. Mari kita bicara tentang cara menulis daftar dengan cepat.

Cara cepat menuliskan daftar ke array

Ingat: ada dua skenario dalam hidup ini. Yang pertama adalah rasa melankolis dan kebosanan saat kita menginisialisasi daftar baru:
List<String> wordsList = new ArrayList();
Dan kemudian kita menambahkan nilai ke dalamnya... Satu demi satu...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Tidak baik. Saya lupa mengapa daftar itu diperlukan saat saya membuatnya! Cara kedua adalah dengan menghentikan semua hal yang tidak perlu dan mengadopsi... kelas utilitas. Misalnya, kelas Arraysyang memiliki metode yang sangat nyaman asList. Anda dapat meneruskannya ke dalamnya apa pun yang ingin Anda buatkan daftarnya, dan metode ini akan menjadikannya sebuah daftar. Sesuatu seperti ini:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
Metode ini memperhitungkan dirinya sendiri varargs- dalam arti tertentu, sebuah array. Saya minta maaf atas kenyataan bahwa dalam kuliah berjudul list to array saya mengajari Anda array ke list terlebih dahulu, tetapi keadaan mengharuskannya. Nah, sekarang ke metode kita untuk mengubah daftar menjadi array.

Metode No.1. Menyergap

Cara ini sangat cocok bagi Anda yang suka mengetik kode di keyboard tanpa banyak berpikir. Semacam meditasi. Langkah 1. Buat array dengan panjang yang sama dengan daftar:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
Langkah 2. Buat loop dengan penghitung untuk mengulangi semua elemen daftar dan dapat mengakses sel array berdasarkan indeks:
for (int i = 0; i < wordsList.size(); i++) {

}
Langkah 3. Di dalam loop, kita menetapkan nilai setiap elemen daftar dengan indeks i ke sel array dengan indeks i:
for (int i = 0; i < wordsList.size(); i++) {
    wordsArray[i] = wordsList.get(i);
}
Hasil:
public static void main(String[] args) {

        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
        String[] wordsArray = new String[wordsList.size()];

        for (int i = 0; i < wordsList.size(); i++) {
            wordsArray[i] = wordsList.get(i);
        }
    }

Metode nomor 2. metode toArray

Mungkin hal yang paling optimal untuk digunakan. Antarmuka Listmemiliki dua metode toArrayyang membuat array dari daftar saat ini:
Object[] toArray();
 T[] toArray(T[] a);
Metode pertama mengembalikan array objek yang berisi semua elemen daftar saat ini (dari yang pertama hingga yang terakhir):
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
        String[] wordsArray = (String[]) wordsList.toArray();

        for (String word : wordsArray) {
            System.out.println(word);
        }

    }
}
Mari kita jalankan metodenya maindan lihat yang berikut ini:

I
love
learning
on
JavaRush
Namun, metode ini memiliki kekhasan: metode ini selalu mengembalikan array objek (Object[]). Oleh karena itu, hasil yang dikembalikan harus disesuaikan dengan tipe data yang diinginkan. Dalam contoh di atas kita melemparkannya ke array string (String[]). Namun metode ini tidak menerima argumen, yang mungkin berguna dalam beberapa situasi. Metode kedua juga mengembalikan array yang berisi semua elemen daftar saat ini (dari pertama hingga terakhir). Namun, tidak seperti metode pertama, metode kedua menggunakan array dengan tipe tertentu sebagai argumen. Namun hasil dari metode kedua bukanlah array objek, melainkan array dengan tipe data tertentu - sama dengan tipe data dalam metode array yang diteruskan sebagai argumen.
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
        String[] wordsArray = wordsList.toArray(new String[0]);

        for (String word : wordsArray) {
            System.out.println(word);
        }

    }
}
Jika kita menjalankan metode ini main, kita akan melihat kata-kata yang sama di output:

I
love
learning
on
JavaRush
Mari kita bicara sedikit tentang array yang diteruskan sebagai argumen ke toArray. Logika metode ini bergantung pada panjang array yang ditransmisikan. Ada tiga kemungkinan skenario:

1. Panjang array yang dikirimkan kurang dari panjang daftar

Dalam hal ini, metode ini membuat array baru dan menempatkan elemen daftar ke dalamnya. Kami mendemonstrasikannya pada contoh di atas.

2. Panjang elemen yang diteruskan sama dengan panjang daftar

Metode ini akan menempatkan elemen daftar ke dalam array yang diteruskan. Mari kita tunjukkan ini:
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");

        // Создаем пустой массив нужной длины
        String[] array = new String[wordsList.size()];

        // Отправляем пустой массив в метод toArray
        wordsList.toArray(array);

        // Проверяем, заполнился ли наш массив. Спойлер: да
        for (String word : array) {
            System.out.println(word);
        }

    }
}
Saat mengeluarkan, kita akan melihat semua baris yang sama, dan akan menjadi jelas bahwa metode tersebut telah mengisi array yang kita buat.

3. Panjang array yang ditransmisikan lebih besar dari panjang daftar

Metode ini akan menulis semua elemen daftar ke dalam array, dan akan menulis nilainya ke dalam sel di sebelah elemen yang terakhir ditambahkan null. Mari kita tunjukkan ini:
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");

        // Создаем пустой массив, длина которого в 2 раза больше длины списка
        String[] array = new String[wordsList.size() * 2];

        for (int i = 0; i < array.length; i++) {
            // В каждую ячейку запишем строковое представление текущего индекса
            array[i] = String.valueOf(i);
        }

        // Отправляем массив в метод toArray
        wordsList.toArray(array);

        // Проверяем, что лежит в нашем массиве
        for (String word : array) {
            System.out.println(word);
        }

    }
}
Setelah menjalankan metode maindi konsol kita akan melihat yang berikut:

I
love
learning
on
JavaRush
null
6
7
8
9
Dari ketiga metode tersebut, manakah yang sebaiknya Anda pilih? Di versi awal Java, yang terbaik adalah meneruskan array dengan panjang yang sama atau lebih besar dari panjang daftar. Namun, JVM modern memiliki pengoptimalan, dan dalam beberapa kasus, JVM memberikan kinerja yang lebih cepat untuk metode yang meneruskan array dengan panjang lebih pendek daripada panjang daftar. Jadi jika Anda menjalankan Java versi modern, teruskan array kosong ke metode seperti yang kita lakukan pada contoh pertama:
wordsList.toArray(new String[0]);

Metode nomor 3. Aliran API

Metode ini cocok bagi mereka yang tidak hanya ingin mengubah daftar menjadi array, tetapi juga memecahkan beberapa masalah lain yang sedang dikerjakan. Dan juga bagi orang-orang yang akrab dengan Java Stream API. JavaRush memiliki artikel bagus tentang topik ini . Di bagian ini kita akan melihat beberapa contoh penggunaan stream. Cara mengonversi daftar ke array menggunakan aliran:
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");

        String[] strings = wordsList.stream()
                .toArray(String[]::new);

        for (String s : strings) {
            System.out.println(s);
        }

        /*
        Output:
        I
        love
        learning
        on
        JavaRush

         */
    }
}
Tetapi jika Anda hanya perlu memasukkan daftar ke dalam array, lebih baik melakukannya menggunakan metode toArrayyang dijelaskan dalam Metode No. 2. Namun jika Anda tidak hanya ingin mengonversi daftar menjadi array, tetapi juga melakukan beberapa tindakan pada setiap elemen, maka ini adalah tempat yang tepat untuk Anda. Mari kita coba mengonversi daftar menjadi array sehingga di array terakhir semua baris ditulis dalam huruf besar:
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");

        String[] strings = wordsList.stream()
                .map(str -> str.toUpperCase())
                .toArray(String[]::new);

        for (String s : strings) {
            System.out.println(s);
        }

        /*
            Output:
            I
            LOVE
            LEARNING
            ON
            JAVARUSH

         */
    }
}
Di sini, .map(str -> str.toUpperCase())kami telah mendefinisikan apa yang perlu dilakukan dengan setiap baris dalam daftar. Dalam hal ini, kami memutuskan untuk mengubah setiap string menjadi huruf besar dan kemudian mengumpulkannya ke dalam array. Menggunakan Stream API memungkinkan Anda tidak hanya mengubah setiap nilai, tetapi juga memfilternya. Misalkan kita ingin mengumpulkan array dari daftar string, tetapi sedemikian rupa sehingga hanya string yang panjangnya lebih dari dua karakter yang disertakan dalam array:
public class Main {
    public static void main(String[] args) {
        List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");

        String[] strings = wordsList.stream()
                .filter(str -> str.length() > 2)
                .map(str -> str.toUpperCase())
                .toArray(String[]::new);

        for (String s : strings) {
            System.out.println(s);
        }

        /*
            Output:
            LOVE
            LEARNING
            JAVARUSH
         */
    }
}
Di sini, di baris ini .filter(str -> str.length() > 2)kita telah membuat apa yang disebut filter yang akan diterapkan ke setiap elemen daftar sebelum masuk ke dalam array. Dalam hal ini, metode ini dipanggil untuk setiap baris length(), dan jika hasil ekspresi str.length() > 2benar, baris tersebut akan dimasukkan ke dalam pilihan yang dihasilkan, dan akhirnya ke dalam larik. Kalau tidak, itu tidak akan mengenai. Di sini, mungkin, perlu dikatakan bahwa hal yang sama dapat dicapai hanya dengan mengulangi elemen-elemennya dan menerapkan berbagai batasan. Anda juga bisa melakukannya dengan cara ini. Stream API menyediakan pendekatan yang lebih fungsional untuk memecahkan masalah tersebut.

Hasil

Pada artikel ini, kita melihat berbagai cara untuk mengonversi daftar menjadi array:
  • pencarian sederhana;
  • metodetoArray;
  • Aliran API.
Pilihan terbaik adalah dengan menggunakan metode toArrayyang didefinisikan dalam antarmuka List. Ada dua metode tersebut:
  • Object[] toArray();
  • T[] toArray(T[] a);
Yang pertama tidak menerima argumen, tetapi mengembalikan array objek, itulah sebabnya Anda paling sering harus menggunakan tipe casting eksplisit. Yang kedua mengembalikan array dengan tipe yang diinginkan, tetapi menggunakan array sebagai argumen. Yang terbaik adalah meneruskan array kosong ke metode ini, dan Anda akan senang. Menggunakan Stream API memungkinkan Anda tidak hanya mengonversi daftar menjadi larik, tetapi juga melakukan beberapa tindakan selama prosesnya, seperti memfilter atau mengonversi elemen sebelum menambahkannya ke larik.

Pekerjaan rumah

Coba ulangi sendiri semua contoh dari artikel ini, tetapi alih-alih menggunakan daftar string asli, gunakan daftar bilangan bulat dari 0 hingga 10. Tentu saja, Anda harus menyesuaikan beberapa kondisi dari contoh yang hanya berlaku untuk string ke yang baru kondisi.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION