JavaRush /Java blogi /Random-UZ /Java roʻyxatidan massivga: elementlar roʻyxatini massivga...
Анзор Кармов
Daraja
Санкт-Петербург

Java roʻyxatidan massivga: elementlar roʻyxatini massivga aylantiring

Guruhda nashr etilgan
Salom! Ushbu maqolada biz Java-da elementlar ro'yxatini elementlar qatoriga qanday aylantirishni ko'rib chiqamiz. Aslida, buni qilishning ko'p usullari mavjud emas va ularning barchasi oddiy, shuning uchun maqola murakkab bo'lmaydi. Java ro'yxatidan massivga: elementlar ro'yxatini massivga aylantirish - 1Keling, nima bilan ishlayotganimizni darhol hal qilaylik. Biz roʻyxatlarni massivlarga, aniqrogʻi, qatorlar roʻyxatini oʻzgartiramiz: I, love, learning, on, JavaRush bir xil satrlar massiviga aylantiriladi. Lekin birinchi navbatda, bir oz bonus. Keling, ro'yxatni qanday tezda yozish haqida gapiraylik.

Massivga ro'yxatni qanday tezda yozish kerak

Esingizda bo'lsin: bu hayotda ikkita stsenariy mavjud. Birinchisi, biz yangi ro'yxatni boshlaganimizda, mutlaq g'amginlik va zerikish:
List<String> wordsList = new ArrayList();
Va keyin biz unga qiymatlarni qo'shamiz ... Birma-bir ...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Yaxshi emas. Ro'yxatni yaratayotganimda nima uchun kerakligini unutibman! Ikkinchi yo'l - barcha keraksiz narsalarni kesib tashlash va ... foydali sinflarni qabul qilish. ArraysMisol uchun, juda qulay usulga ega bo'lgan sinf asList. Siz ro'yxat tuzmoqchi bo'lgan narsangizni unga kiritishingiz mumkin va usul uni ro'yxat qiladi. Shunga o'xshash narsa:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
varargsBu usul o'z-o'zidan - qaysidir ma'noda massivni oladi . Roʻyxat to array deb nomlangan maʼruzada men sizga massivni birinchi boʻlib roʻyxatga olishni oʻrgatganim uchun uzr soʻrayman, lekin sharoit buni talab qildi. Xo'sh, endi ro'yxatlarni massivlarga aylantirish usullariga.

№1 usul. Büstü

Bu usul ko'p o'ylamasdan klaviaturada kod yozishni yaxshi ko'radiganlar uchun juda mos keladi. Meditatsiyaning bir turi. 1-qadam. Roʻyxat bilan bir xil uzunlikdagi massiv yarating:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
2-qadam. Roʻyxatning barcha elementlarini takrorlash va massiv kataklariga indeks boʻyicha kirish uchun hisoblagich bilan halqa yarating:
for (int i = 0; i < wordsList.size(); i++) {

}
3-qadam. Tsikl ichida biz i indeksli ro‘yxatning har bir elementi qiymatini i indeksli massiv yacheykasiga belgilaymiz:
for (int i = 0; i < wordsList.size(); i++) {
    wordsArray[i] = wordsList.get(i);
}
Natija:
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);
        }
    }

№ 2 usul. toArray usuli

Ehtimol, foydalanish uchun eng maqbul narsa. Interfeysda joriy ro'yxatdan massiv yaratadigan Listikkita usul mavjud :toArray
Object[] toArray();
 T[] toArray(T[] a);
Birinchi usul joriy ro'yxatning barcha elementlarini o'z ichiga olgan ob'ektlar majmuasini qaytaradi (birinchidan oxirgigacha):
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);
        }

    }
}
Keling, usulni ishga tushiramiz mainva quyidagilarni ko'ramiz:

I
love
learning
on
JavaRush
Biroq, bu usulning o'ziga xos xususiyati bor: u har doim ob'ektlar qatorini qaytaradi (Object[]). Shuning uchun qaytarilgan natija kerakli ma'lumotlar turiga o'tkazilishi kerak. Yuqoridagi misolda biz uni satrlar qatoriga joylashtirdik (String[]). Ammo bu usul argumentlarni qabul qilmaydi, bu ba'zi holatlarda qulay bo'lishi mumkin. Ikkinchi usul, shuningdek, joriy ro'yxatning barcha elementlarini o'z ichiga olgan massivni qaytaradi (birinchidan oxirgigacha). Biroq, birinchisidan farqli o'laroq, ikkinchi usul argument sifatida ma'lum turdagi massivni oladi. Ammo ikkinchi usulning natijasi ob'ektlar massivi emas, balki ma'lum bir ma'lumotlar tipidagi massiv bo'ladi - argument sifatida uzatilgan massiv usulidagi ma'lumotlar turi bilan bir xil.
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);
        }

    }
}
Agar biz usulni ishga tushirsak main, chiqishda bir xil so'zlarni ko'ramiz:

I
love
learning
on
JavaRush
ga argument sifatida uzatiladigan massiv haqida bir oz gapiraylik toArray. Usulning mantig'i uzatilgan massivning uzunligiga bog'liq. Uchta mumkin bo'lgan stsenariy mavjud:

1. O'tkazilayotgan massivning uzunligi ro'yxat uzunligidan kamroq

Bunday holda, usul yangi massiv yaratadi va unga ro'yxat elementlarini joylashtiradi. Biz buni yuqoridagi misolda ko'rsatdik.

2. O'tkazilayotgan elementning uzunligi ro'yxat uzunligiga teng

Usul ro'yxat elementlarini o'tkazilgan massivga joylashtiradi. Keling, buni namoyish qilaylik:
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);
        }

    }
}
Chiqarish paytida biz bir xil satrlarni ko'ramiz va usul biz yaratgan massivni to'ldirganligi aniq bo'ladi.

3. O'tkazilayotgan massivning uzunligi ro'yxat uzunligidan kattaroqdir

Usul ro'yxatning barcha elementlarini massivga yozadi va qiymatni oxirgi qo'shilgan element yonidagi katakka yozadi null. Keling, buni namoyish qilaylik:
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);
        }

    }
}
mainKonsolda usulni ishga tushirgandan so'ng biz quyidagilarni ko'ramiz:

I
love
learning
on
JavaRush
null
6
7
8
9
Uchta usuldan qaysi birini tanlash kerak? Java-ning dastlabki versiyalarida uzunligi ro'yxat uzunligiga teng yoki undan kattaroq massivni o'tkazish maqbul bo'lgan. Biroq, zamonaviy JVMlar optimallashtirishga ega va ba'zi hollarda ular ro'yxat uzunligidan qisqaroq uzunlikdagi massivdan o'tgan usul uchun tezroq ishlashni ta'minlaydi. Shunday qilib, agar siz Java-ning zamonaviy versiyasini ishlatayotgan bo'lsangiz, birinchi misolda bo'lgani kabi, bo'sh massivni usulga o'tkazing:
wordsList.toArray(new String[0]);

3-usul raqami. Stream API

Ushbu usul nafaqat ro'yxatni massivga aylantirishni, balki yo'lda bir nechta boshqa muammolarni hal qilishni xohlaydiganlar uchun javob beradi. Shuningdek, Java Stream API bilan tanish odamlar uchun. JavaRush-da ushbu mavzu bo'yicha yaxshi maqola bor . Ushbu bo'limda biz oqimlardan foydalangan holda bir nechta misollarni ko'rib chiqamiz. Oqimlar yordamida ro'yxatni massivga qanday aylantirish mumkin:
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

         */
    }
}
toArrayAmmo agar siz shunchaki ro'yxatni massivga o'tkazishingiz kerak bo'lsa, unda buni 2-usulda tasvirlangan usul yordamida amalga oshirish yaxshiroqdir . Ammo agar siz nafaqat ro'yxatni massivga aylantirishni, balki har bir elementda ba'zi amallarni bajarishni istasangiz, bu siz uchun to'g'ri joy. Keling, ro'yxatni massivga aylantirishga harakat qilaylik, shunda oxirgi massivda barcha satrlar katta harf bilan yoziladi:
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

         */
    }
}
Bu erda .map(str -> str.toUpperCase())biz ro'yxatdagi har bir satr bilan nima qilish kerakligini aniqladik. Bunday holda, biz har bir satrni katta harfga aylantirishga va keyin uni massivga yig'ishga qaror qildik. Stream API-dan foydalanish nafaqat har bir qiymatni o'zgartirish, balki ularni filtrlash imkonini beradi. Aytaylik, biz satrlar ro'yxatidan massivni yig'moqchimiz, lekin massivga faqat ikki belgidan uzunroq satrlar kiritiladigan tarzda:
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
         */
    }
}
Bu erda qatorda .filter(str -> str.length() > 2)biz ro'yxatning har bir elementiga massivga kirishdan oldin qo'llaniladigan filtr deb ataladigan filtrni yaratdik. Bunday holda, usul har bir satr uchun chaqiriladi length()va agar ifodaning natijasi str.length() > 2to'g'ri bo'lsa, bunday qator natijada tanlangan tanlovda va oxir-oqibat massivda tugaydi. Aks holda, u urmaydi. Bu erda, ehtimol, shuni aytish kerakki, elementlarni takrorlash va turli xil cheklovlar qo'yish orqali ham shunga erishish mumkin. Siz ham shunday qilishingiz mumkin. Stream API bunday muammolarni hal qilish uchun yanada funktsional yondashuvni taqdim etadi.

Natijalar

Ushbu maqolada biz ro'yxatlarni massivlarga aylantirishning turli usullarini ko'rib chiqdik:
  • oddiy qidiruv;
  • usulitoArray;
  • Stream API.
toArrayEng yaxshi variant - interfeysda belgilangan usuldan foydalanish List. Bunday ikkita usul mavjud:
  • Object[] toArray();
  • T[] toArray(T[] a);
Birinchisi argumentlarni qabul qilmaydi, lekin bir qator ob'ektlarni qaytaradi, shuning uchun siz ko'pincha aniq turdagi kastingga murojaat qilishingiz kerak bo'ladi. Ikkinchisi kerakli turdagi massivni qaytaradi, lekin argument sifatida massivni oladi. Usulga bo'sh massivni o'tkazish yaxshidir va siz xursand bo'lasiz. Stream API dan foydalanish nafaqat roʻyxatni massivga aylantirish, balki ularni massivga qoʻshishdan oldin elementlarni filtrlash yoki oʻzgartirish kabi baʼzi amallarni bajarishga ham imkon beradi.

Uy vazifasi

Ushbu maqoladagi barcha misollarni o'zingiz takrorlashga harakat qiling, lekin satrlarning asl ro'yxati o'rniga 0 dan 10 gacha bo'lgan butun sonlar ro'yxatidan foydalaning. Tabiiyki, siz faqat satrlarga tegishli bo'lgan misollardagi ba'zi shartlarni yangisiga moslashingiz kerak bo'ladi. sharoitlar.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION