JavaRush /Java блогу /Random-KY /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);
Биринчи ыкма учурдагы тизменин бардык элементтерин камтыган 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[]). Бирок бул ыкма кээ бир жагдайларда ыңгайлуу болушу мүмкүн болгон аргументтерди кабыл алbyte. Экинчи ыкма ошондой эле учурдагы тизменин бардык элементтерин камтыган массивди кайтарат (биринчиден акыркыга чейин). Бирок, биринчиден айырмаланып, экинчи ыкма аргумент катары белгилүү бир типтеги массивди алат. Бирок экинчи ыкманын натыйжасы 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нын алгачкы versionларында узундугу тизменин узундугуна барабар же андан чоңураак массивди өткөрүү оптималдуу болгон. Бирок, заманбап JVMлердин оптималдаштыруулары бар жана кээ бир учурларда алар тизменин узундугуна караганда кыскараак узундуктагы массивден өткөн ыкма үчүн тезирээк иштешин камсыз кылат. Демек, сиз Javaнын заманбап versionсын иштетип жатсаңыз, биринчи мисалдагыдай ыкмага бош массивди өткөрүңүз:
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);
Биринчиси аргументтерди кабыл алbyte, бирок an objectтердин массивдерин кайтарат, ошондуктан сиз көбүнчө ачык типтеги кастингге кайрылууга туура келет. Экинчиси керектүү типтеги массивди кайтарат, бирок массивди аргумент катары алат. Методго бош массивди бергениңиз жакшы, ошондо сиз бактылуу болосуз. Stream API колдонуу тизмени массивге айландырууга гана эмес, ошондой эле жол боюндагы кээ бир аракеттерди аткарууга, мисалы, элементтерди массивге кошуудан мурун чыпкалоо же конвертациялоого мүмкүндүк берет.

Үй иш

Бул макаладагы бардык мисалдарды өзүңүз кайталап көрүңүз, бирок саптардын баштапкы тизмесинин ордуна 0дөн 10го чейинки бүтүн сандардын тизмесин колдонуңуз. Албетте, саптарга гана тиешелүү болгон мисалдардагы кээ бир шарттарды жаңысына ылайыкташууга туура келет. шарттар.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION