JavaRush /Java Blogu /Random-AZ /Java siyahısından massiv: elementlərin siyahısını massilə...
Анзор Кармов
Səviyyə
Санкт-Петербург

Java siyahısından massiv: elementlərin siyahısını massiləyə çevirin

Qrupda dərc edilmişdir
Salam! Bu yazıda Java-da elementlər siyahısının elementlər massivinə necə çevrilməsinə baxacağıq. Əslində, bunu etmək üçün bir çox yol yoxdur və hamısı sadədir, buna görə məqalə mürəkkəb olmayacaq. Java siyahısından massiv: elementlərin siyahısını massiləyə çevirin - 1Dərhal nə ilə işlədiyimizə qərar verək. Siyahıları massivlərə, daha dəqiq desək, sətirlərin siyahısına çevirəcəyik: I, love, learning, on, JavaRush eyni sətirlərin massivinə çevriləcək. Ancaq əvvəlcə bir az bonus. Siyahını necə tez yazmaq barədə danışaq.

Massiv üçün siyahını necə tez yazmaq olar

Unutmayın: bu həyatda iki ssenari var. Birincisi, yeni siyahıya başladığımız zaman tam melanxolik və cansıxıcılıqdır:
List<String> wordsList = new ArrayList();
Sonra ona dəyərlər əlavə edirik... Bir-bir...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Yaxşı deyil. Siyahını yaratarkən niyə lazım olduğunu unutdum! İkinci yol bütün lazımsız şeyləri kəsib... kommunal dərsləri qəbul etməkdir. Məsələn, Arraysinanılmaz dərəcədə rahat metodu olan sinif asList. Siyahı etmək istədiyiniz hər şeyi daxil edə bilərsiniz və üsul onu siyahı halına gətirəcək. Bu kimi bir şey:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
Bu üsul öz-özünə götürür varargs- müəyyən mənada massiv. Üzr istəyirəm ki, list to array adlı mühazirədə mən sizə massivi ilk sıralamağı öyrətmişəm, amma şərait bunu tələb edirdi. Yaxşı, indi siyahıları massivlərə çevirmək üsullarımıza keçək.

Metod №1. Büst

Bu üsul çox düşünmədən klaviaturada kod yazmağı sevənlər üçün idealdır. Bir növ meditasiya. Addım 1. Siyahı ilə eyni uzunluqda massiv yaradın:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
Addım 2. Siyahının bütün elementləri arasında təkrarlamaq və massiv hüceyrələrinə indekslə daxil olmaq üçün sayğaclı dövrə yaradın:
for (int i = 0; i < wordsList.size(); i++) {

}
Addım 3. Döngənin daxilində i indeksli siyahının hər bir elementinin qiymətini i indeksli massiv xanasına təyin edirik:
for (int i = 0; i < wordsList.size(); i++) {
    wordsArray[i] = wordsList.get(i);
}
Nəticə:
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);
        }
    }

Metod № 2. toArray metodu

Yəqin ki, istifadə etmək üçün ən optimal şey. İnterfeys cari siyahıdan massiv yaradan Listiki üsula malikdir :toArray
Object[] toArray();
 T[] toArray(T[] a);
Birinci üsul cari siyahının bütün elementlərini ehtiva edən obyektlər massivini qaytarır (birincidən sonuncuya qədər):
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);
        }

    }
}
Gəlin metodu işə salaq mainvə aşağıdakılara baxaq:

I
love
learning
on
JavaRush
Bununla belə, bu metodun bir xüsusiyyəti var: həmişə bir sıra obyektləri qaytarır (Object[]). Buna görə də, qaytarılan nəticə istədiyiniz məlumat növünə köçürülməlidir. Yuxarıdakı misalda biz onu sətirlər massivinə köçürdük (String[]). Ancaq bu üsul bəzi hallarda rahat ola bilən arqumentləri qəbul etmir. İkinci üsul həmçinin cari siyahının bütün elementlərini ehtiva edən massivi qaytarır (birincidən sonuncuya qədər). Lakin birincidən fərqli olaraq, ikinci üsul müəyyən tipli massivi arqument kimi qəbul edir. Lakin ikinci metodun nəticəsi obyektlər massivi deyil, müəyyən məlumat tipli massiv olacaq - arqumentlər kimi ötürülən massiv metodunda verilənlər növü ilə eyni.
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);
        }

    }
}
Metodunu işlədirsək main, çıxışda eyni sözləri görəcəyik:

I
love
learning
on
JavaRush
-a arqument kimi ötürülən massiv haqqında bir az danışaq toArray. Metodun məntiqi ötürülən massivin uzunluğundan asılıdır. Üç mümkün ssenari var:

1. Göndərilən massivin uzunluğu siyahının uzunluğundan azdır

Bu halda metod yeni massiv yaradır və siyahı elementlərini onun içinə yerləşdirir. Bunu yuxarıdakı nümunədə nümayiş etdirdik.

2. Ötürülən elementin uzunluğu siyahının uzunluğuna bərabərdir

Metod siyahı elementlərini ötürülən massivdə yerləşdirəcək. Bunu nümayiş etdirək:
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);
        }

    }
}
Çıxış zamanı biz bütün eyni sətirləri görəcəyik və metodun yaratdığımız massivi doldurduğu aydın olacaq.

3. Göndərilən massivin uzunluğu siyahının uzunluğundan böyükdür

Metod siyahının bütün elementlərini massivə yazacaq və dəyəri sonuncu əlavə edilmiş elementin yanındakı xanaya yazacaq null. Bunu nümayiş etdirək:
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 metodu işə saldıqdan sonra aşağıdakıları görəcəyik:

I
love
learning
on
JavaRush
null
6
7
8
9
Üç üsuldan hansını seçməlisiniz? Java-nın ilkin versiyalarında uzunluğu siyahının uzunluğuna bərabər və ya ondan çox olan massivdən keçmək optimal idi. Bununla belə, müasir JVM-lərdə optimallaşdırmalar var və bəzi hallarda onlar siyahının uzunluğundan daha qısa uzunluqlu massivdən keçən metod üçün daha sürətli performans təmin edir. Beləliklə, Java-nın müasir versiyasını işlədirsinizsə, ilk nümunədə etdiyimiz kimi metoda boş massiv keçirin:
wordsList.toArray(new String[0]);

Metod №3. Stream API

Bu üsul yalnız bir siyahını massiləyə çevirmək deyil, həm də yol boyu bir neçə digər problemi həll etmək istəyənlər üçün uyğundur. Həm də Java Stream API ilə tanış olan insanlar üçün. JavaRush-un bu mövzuda yaxşı məqaləsi var . Bu bölmədə axınlardan istifadə etməklə bir neçə nümunəyə baxacağıq. Axınlardan istifadə edərək siyahını massiləyə necə çevirmək olar:
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

         */
    }
}
Ancaq sadəcə siyahını massivə köçürmək lazımdırsa, o zaman bunu toArray2-ci Metodda təsvir olunan metoddan istifadə etməklə etmək daha yaxşıdır. Ancaq yalnız siyahını massivə çevirmək deyil, həm də hər bir elementdə bəzi hərəkətlər etmək istəyirsinizsə, bu sizin üçün doğru yerdir. Siyahını massilə çevirməyə çalışaq ki, son massivdə bütün sətirlər böyük hərflə yazılsın:
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

         */
    }
}
Burada .map(str -> str.toUpperCase())siyahıdakı hər bir sətirlə nə edilməli olduğunu müəyyən etdik. Bu halda, hər bir sətri böyük hərflərə çevirmək və sonra onu massivdə toplamaq qərarına gəldik. Stream API-dən istifadə yalnız hər bir dəyəri dəyişdirməyə deyil, həm də onları filtrləməyə imkan verir. Tutaq ki, biz sətirlər siyahısından bir massiv toplamaq istəyirik, lakin elə bir şəkildə ki, seriala yalnız iki simvoldan uzun sətirlər daxil olsun:
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
         */
    }
}
Burada sətirdə .filter(str -> str.length() > 2)siyahının hər bir elementinə massivə daxil edilməzdən əvvəl tətbiq ediləcək sözdə filtr yaratdıq. Bu halda, metod hər bir sıra üçün çağırılır length()və ifadənin nəticəsi str.length() > 2doğrudursa, belə bir sıra nəticədə seçilmiş seçimdə və sonda massivdə bitəcəkdir. Əks halda, vurmayacaq. Burada, bəlkə də, eyni şeyi sadəcə elementlər üzərində təkrarlamaq və müxtəlif məhdudiyyətlər qoymaqla əldə edilə biləcəyini söyləməyə dəyər. Siz də bu şəkildə edə bilərsiniz. Stream API bu cür problemləri həll etmək üçün daha funksional yanaşma təqdim edir.

Nəticələr

Bu yazıda biz siyahıları massivlərə çevirməyin müxtəlif yollarına baxdıq:
  • sadə axtarış;
  • üsultoArray;
  • Stream API.
toArrayƏn yaxşı seçim interfeysdə müəyyən edilmiş metoddan istifadə etməkdir List. Belə iki üsul var:
  • Object[] toArray();
  • T[] toArray(T[] a);
Birincisi arqumentləri qəbul etmir, lakin bir sıra obyektləri qaytarır, buna görə də siz çox vaxt açıq tipli castingə müraciət etməli olacaqsınız. İkincisi istədiyiniz tipli massivi qaytarır, lakin arqument kimi massivi götürür. Boş massivi metoda ötürmək ən yaxşısıdır və siz xoşbəxt olacaqsınız. Stream API-dən istifadə sizə təkcə siyahını massiləyə çevirməyə deyil, həm də elementləri massiləyə əlavə etməzdən əvvəl süzgəcdən keçirmək və ya konvertasiya etmək kimi bəzi hərəkətləri yerinə yetirməyə imkan verir.

Ev tapşırığı

Bu məqalədəki bütün nümunələri özünüz təkrarlamağa çalışın, lakin sətirlərin orijinal siyahısı əvəzinə 0-dan 10-a qədər tam ədədlər siyahısından istifadə edin. Təbii ki, siz yalnız sətirlərə aid olan nümunələrdən bəzi şərtləri yeni sətirlərə uyğunlaşdırmalısınız. şərtlər.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION