JavaRush /Java блогы /Random-KK /Java тізімін массивке: элементтер тізімін массивке түрлен...
Анзор Кармов
Деңгей
Санкт-Петербург

Java тізімін массивке: элементтер тізімін массивке түрлендіру

Топта жарияланған
Сәлеметсіз бе! Бұл мақалада біз Java тіліндегі элементтердің тізімін элементтер массивіне қалай түрлендіру керектігін қарастырамыз. Шын мәнінде, мұны істеудің көптеген жолдары жоқ және олардың барлығы қарапайым, сондықтан мақала күрделі болмайды. Java тізімін массивке: элементтер тізімін массивке түрлендіру - 1Немен жұмыс істейтінімізді бірден шешейік. Біз тізімдерді массивтерге түрлендіреміз, дәлірек айтқанда, жолдар тізімі: I, love, learning, on, JavaRush бірдей жолдардың массивіне түрлендіріледі. Бірақ алдымен кішкене бонус. Тізімді қалай тез жазу керектігі туралы сөйлесейік.

Тізімді массивке қалай тез жазуға болады

Есіңізде болсын: бұл өмірде екі сценарий бар. Біріншісі, біз жаңа тізімді инициализациялаған кездегі мүлде меланхолия мен зерігу:
List<String> wordsList = new ArrayList();
Сосын оған құндылықтарды қосамыз... Бірінен соң бірі...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Жақсы емес. Мен тізімді жасап жатқанда не үшін қажет екенін ұмытып қалдым! Екінші жол - барлық қажетсіз нәрселерді кесіп, ... пайдалы сыныптарды қабылдау. Мысалы, Arraysөте ыңғайлы әдісі бар класс asList. Сіз оған тізім жасағыңыз келетін нәрсені енгізе аласыз және әдіс оны тізімге айналдырады. Сол сияқты бірнәрсе:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
Бұл әдіс өзіне varargs- белгілі бір мағынада массив алады. Тізімнен массив деп аталатын дәрісте мен сізге массивті алдымен тізімдеуді үйреткенім үшін кешірім сұраймын, бірақ жағдай мұны талап етті. Енді тізімдерді массивтерге түрлендіру әдістеріне.

№1 әдіс. Бюст

Бұл әдіс пернетақтада көп ойланбастан codeты теруді ұнататындар үшін өте қолайлы. Медитацияның бір түрі. 1-қадам. Тізіммен бірдей ұзындықтағы массив жасаңыз:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
2-қадам. Тізімнің барлық элементтерін қайталау және массив ұяшықтарына индекс бойынша қол жеткізу үшін есептегіші бар цикл жасаңыз:
for (int i = 0; i < wordsList.size(); i++) {

}
Қадам 3. Цикл ішінде i индексі бар тізімнің әрбір элементінің мәнін i индексі бар массив ұяшығына тағайындаймыз:
for (int i = 0; i < wordsList.size(); i++) {
    wordsArray[i] = wordsList.get(i);
}
Нәтиже:
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 әдіс. toArray әдісі

Мүмкін пайдалану үшін ең оңтайлы нәрсе. Интерфейсте ағымдағы тізімнен массив жасайтын Listекі әдіс бар :toArray
Object[] toArray();
 T[] toArray(T[] a);
Бірінші әдіс ағымдағы тізімнің барлық элементтерін қамтитын нысандар жиымын қайтарады (біріншіден соңғыға дейін):
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);
        }

    }
}
Әдісті іске қосып main, келесіні көрейік:

I
love
learning
on
JavaRush
Дегенмен, бұл әдістің ерекшелігі бар: ол әрқашан an objectілер массивін қайтарады (Object[]). Сондықтан қайтарылған нәтиже қажетті деректер түріне шығарылуы керек. Жоғарыдағы мысалда біз оны жолдар массивіне шығардық (String[]). Бірақ бұл әдіс кейбір жағдайларда ыңғайлы болуы мүмкін дәлелдерді қабылдамайды. Екінші әдіс сонымен қатар ағымдағы тізімнің барлық элементтерін қамтитын массивді қайтарады (біріншіден соңғыға дейін). Дегенмен, біріншіден айырмашылығы, екінші әдіс аргумент ретінде белгілі бір типтегі массивді алады. Бірақ екінші әдістің нәтижесі an objectілер массиві емес, белгілі бір деректер түрінің массиві болады - аргумент ретінде берілген массив әдісіндегі деректер түрі сияқты.
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);
        }

    }
}
Егер әдісті іске қоссақ main, шығыста бірдей сөздерді көреміз:

I
love
learning
on
JavaRush
-ге аргумент ретінде берілетін массив туралы аздап сөйлесейік toArray. Әдістің логикасы жіберілетін массивтің ұзындығына байланысты. Үш ықтимал сценарий бар:

1. Жіберілген массивтің ұзындығы тізім ұзындығынан аз

Бұл жағдайда әдіс жаңа массив жасайды және оған тізім элементтерін орналастырады. Біз мұны жоғарыдағы мысалда көрсеттік.

2. Өткізілетін элементтің ұзындығы тізімнің ұзындығына тең

Әдіс тізім элементтерін берілген массивке орналастырады. Мұны көрсетейік:
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);
        }

    }
}
Шығару кезінде біз барлық бірдей жолдарды көреміз және әдіс біз жасаған массивті толтырғаны белгілі болады.

3. Жіберілген массивтің ұзындығы тізімнің ұзындығынан үлкен

Әдіс тізімнің барлық элементтерін массивке жазады және мәнді соңғы қосылған элементтің жанындағы ұяшыққа жазады null. Мұны көрсетейік:
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);
        }

    }
}
mainКонсольде әдісті іске қосқаннан кейін біз келесіні көреміз:

I
love
learning
on
JavaRush
null
6
7
8
9
Үшеуінің қайсысын таңдау керек? Java-ның алғашқы нұсқаларында ұзындығы тізім ұзындығына тең немесе одан үлкен массивті беру оңтайлы болды. Дегенмен, қазіргі JVM құрылғыларында оңтайландырулар бар және кейбір жағдайларда олар тізімнің ұзындығынан қысқарақ массив өткізілетін әдіс үшін жылдамырақ өнімділікті қамтамасыз етеді. Сондықтан Java-ның заманауи нұсқасын іске қосып жатсаңыз, бірінші мысалдағыдай әдіске бос массив жіберіңіз:
wordsList.toArray(new String[0]);

№3 әдіс. Stream API

Бұл әдіс тек тізімді массивке түрлендіруді ғана емес, сонымен қатар басқа да бірнеше мәселені шешуді қалайтындар үшін қолайлы. Сондай-ақ Java Stream API-мен таныс адамдар үшін. Бұл тақырып бойынша JavaRush жақсы мақаласы бар . Бұл бөлімде ағындарды пайдаланатын бірнеше мысалдарды қарастырамыз. Ағындарды пайдаланып тізімді массивке қалай түрлендіруге болады:
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

         */
    }
}
Бірақ егер сізге жай ғана тізімді массивке шығару керек болса, онда мұны toArray№2 әдісте сипатталған әдіс арқылы жасаған дұрыс. Бірақ егер сіз тізімді массивке түрлендіруді ғана емес, сонымен қатар әрбір элементте қандай да бір әрекетті орындауды қаласаңыз, онда бұл сіз үшін дұрыс орын. Соңғы массивте барлық жолдар бас әріппен жазылатындай етіп тізімді массивке түрлендіруге тырысайық:
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

         */
    }
}
Мұнда .map(str -> str.toUpperCase())біз тізімдегі әрбір жолмен не істеу керектігін анықтадық. Бұл жағдайда біз әрбір жолды бас әріпке түрлендіруді, содан кейін оны массивке жинауды шештік. Stream API пайдалану әрбір мәнді түрлендіруге ғана емес, сонымен қатар оларды сүзуге мүмкіндік береді. Жолдар тізімінен массив жинағымыз келеді делік, бірақ массивке тек екі таңбадан ұзын жолдар ғана қосылатындай етіп:
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
         */
    }
}
Бұл жолда .filter(str -> str.length() > 2)біз тізімнің әрбір элементіне массивке кірмес бұрын қолданылатын сүзгіні жасадық. Бұл жағдайда әдіс әрбір жол үшін шақырылады length()және өрнектің нәтижесі str.length() > 2ақиқат болса, мұндай жол нәтиже таңдауда және ең соңында массивте аяқталады. Әйтпесе, соқпайды. Бұл жерде, мүмкін, элементтерді қайталау және әртүрлі шектеулер енгізу арқылы бірдей нәрсеге қол жеткізуге болатынын айту керек. Сіз мұны осылай жасай аласыз. Stream API мұндай мәселелерді шешу үшін неғұрлым функционалды тәсілді ұсынады.

Нәтижелер

Бұл мақалада біз тізімдерді массивтерге түрлендірудің әртүрлі жолдарын қарастырдық:
  • қарапайым іздеу;
  • әдісtoArray;
  • Stream API.
toArrayЕң жақсы нұсқа - интерфейсте анықталған әдісті пайдалану List. Мұндай екі әдіс бар:
  • Object[] toArray();
  • T[] toArray(T[] a);
Біріншісі аргументтерді қабылдамайды, бірақ an objectілер массивін қайтарады, сондықтан сіз көбінесе анық түрдегі кастингке жүгінуге тура келеді. Екіншісі қалаған түрдегі массивді қайтарады, бірақ аргумент ретінде массивді қабылдайды. Әдіске бос массив жіберген дұрыс, сонда сіз бақытты боласыз. Stream API пайдалану тізімді массивке түрлендіруге ғана емес, сонымен қатар элементтерді массивке қоспас бұрын сүзу немесе түрлендіру сияқты жол бойындағы кейбір әрекеттерді орындауға мүмкіндік береді.

Үй жұмысы

Осы мақаладағы барлық мысалдарды өзіңіз қайталауға тырысыңыз, бірақ жолдардың бастапқы тізімінің орнына 0-ден 10-ға дейінгі бүтін сандар тізімін пайдаланыңыз. Әрине, сізге тек жолдарға қолданылатын мысалдардағы кейбір шарттарды жаңаға бейімдеуге тура келеді. шарттар.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION