JavaRush /Блоги Java /Random-TG /Рӯйхати 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. Дар дохor давра мо арзиши ҳар як элементи рӯйхатро бо индекси 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);
Усули аввал массиви an objectҳоеро бар мегардонад, ки дорои ҳама унсурҳои рӯйхати ҷорӣ мебошанд (аз аввал то охир):
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
Кадоме аз се усулро интихоб кардан лозим аст? Дар versionҳои аввали Java, интиқол додани массив бо дарозии ба дарозии рӯйхат баробар ё бештар аз он мувофиқ буд. Аммо, JVM-ҳои муосир оптимизатсия доранд ва дар баъзе мавридҳо онҳо иҷрои тезтарро барои усуле таъмин мекунанд, ки массиви дарозии кӯтоҳтар аз дарозии рӯйхат мегузарад. Пас, агар шумо versionи муосири Java-ро иҷро карда истода бошед, массиви холиро ба усуле гузаронед, ки мо дар мисоли аввал кардем:
wordsList.toArray(new String[0]);

Усули рақами 3. API Stream

Ин усул барои онҳое мувофиқ аст, ки мехоҳанд на танҳо рӯйхатро ба массив табдил диҳанд, балки якчанд мушкилоти дигарро дар роҳ ҳал кунанд. Ва инчунин барои одамоне, ки бо 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;
  • API Stream.
Беҳтарин вариант ин истифодаи усулест 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