JavaRush /Java blogi /Random-UZ /Java-da ajratish usuli: satrni qismlarga bo'lish

Java-da ajratish usuli: satrni qismlarga bo'lish

Guruhda nashr etilgan
Keling, String split usuli haqida gapiraylik : u nima qiladi va nima uchun kerak. U ipni ajratayotganini taxmin qilish oson, lekin amalda u qanday ishlaydi? Keling, ushbu usul qanday ishlashini batafsil ko'rib chiqamiz va ba'zi bir aniq bo'lmagan tafsilotlarni muhokama qilamiz va shu bilan birga String sinfida qancha bo'linish usullari mavjudligini aniqlaymiz. Qani ketdik!

Java String.split uchun ta'rif va imzo

Java-dagi bo'linish usuli oddiy ifoda yordamida belgilangan chegaralovchi yordamida satrni pastki qatorlarga ajratadi. Keling, usulga imzo qo'yamiz va sho'ng'inimizni boshlaymiz:
String[] split(String regex)
Imzodan ikkita narsa aniq:
  1. Usul qatorlar qatorini qaytaradi.
  2. Usul parametr sifatida regex satrini oladi.
Keling, yuqorida keltirilgan ta'rif nuqtai nazaridan har bir narsani alohida ko'rib chiqaylik.
  1. Usul qatorlar qatorini qaytaradi.

    Ta'rif quyidagi so'zlarni o'z ichiga oladi: " Java'da bo'linish usuli qatorni pastki qatorlarga ajratadi." Ushbu pastki qatorlar usul bo'yicha massivga yig'iladi va uning qaytish qiymatini ifodalaydi.

  2. Usul parametr sifatida regex satrini oladi.

    Shunga qaramay, ta'rifni eslang: "muntazam ifoda yordamida ko'rsatilgan cheklovchidan foydalanib, satrni pastki qatorlarga ajratadi." Qabul qilingan regex parametri manba qatoriga qo'llaniladigan va manba qatoridagi ajratuvchi belgiga (yoki belgilar kombinatsiyasiga) mos keladigan muntazam ifoda namunasidir.

Java-da ajratish usuli: satrni qismlarga bo'lish - 1

Amalda bo'linish

Endi biznesga kirishamiz. Tasavvur qilaylik, bizda so'zlardan iborat ip bor. Masalan, bu kabi:
Men Java-ni yaxshi ko'raman
Biz ipni so'zlarga ajratishimiz kerak. Bu qatorda so‘zlar bir-biridan bo‘shliqlar bilan ajratilganligini ko‘ramiz. Kosmos bu holda ajratuvchi roli uchun ideal nomzoddir. Ushbu muammoni hal qilish uchun kod quyidagicha ko'rinadi:
public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
Asosiy usulning chiqishi quyidagi satrlar bo'ladi:
Men Java-ni yaxshi ko'raman
Keling, split usuli qanday ishlashiga yana bir nechta misollarni ko'rib chiqaylik :
Chiziq Ajratuvchi Usulning natijasi
"Men Javani yaxshi ko'raman" "" (bo'shliq belgisi) { "Men" , "sevgi" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Qizil, to'q sariq, sariq" "," { "Qizil" , "to'q sariq" , "sariq" }
"Qizil, to'q sariq, sariq" ", " { "Qizil" , "to'q sariq" , "sariq" }
Yuqoridagi jadvaldagi oxirgi ikki qator o'rtasidagi farqlarga e'tibor bering. Oxirgi satrda ajratuvchi vergul boʻladi, shuning uchun qator shunday boʻlinadiki, baʼzi soʻzlarda bosh boʻshliqlar boʻladi. Oxirgi satrda biz ajratuvchi sifatida vergul va bo'sh joydan foydalandik. Shunday qilib, olingan massivda bosh bo'shliqlari bo'lgan qatorlar yo'q edi. Bu to'g'ri ajratgichni diqqat bilan tanlash qanchalik muhimligini ko'rsatadigan kichik bir tafsilot.

Etakchi chegaralovchi

Yana bir muhim nuance bor. Agar manba qatori chegaralovchi bilan boshlansa, hosil bo'lgan massivning birinchi elementi bo'sh qator bo'ladi. Misolda, u quyidagicha ko'rinadi: Manba qatori: "I love Java" Delimiter: " " Natijadagi massiv: { "" , "I" , "love" , "Java" } Lekin agar manba qatori chegaralovchi bilan tugasa. va boshlanmasa, natija boshqacha bo'ladi: Manba qatori: "I love Java" Separator: " " Natijadagi massiv: { "I" , "love" , "Java" } Split usulining o'zgarishlarini kodda ko'rib chiqamiz. manba satrining oxirida va/yoki boshida ajratuvchi belgi bilan:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Asosiy usulning chiqishi quyidagicha bo'ladi:
[I, love, Java] [, I, love, Java] [I, love, Java] [, I, love, Java]
Yana bir bor esda tutingki, manba qatoridagi birinchi belgi ajratuvchi belgi bo'lsa, natijada olingan massiv birinchi element sifatida bo'sh qatorga ega bo'ladi.

Haddan tashqari yuklangan odam

String sinfida ushbu imzo bilan boshqa ajratish usuli mavjud:
String[] split(String regex, int limit)
Ushbu usul qo'shimcha chegara parametriga ega: u regex naqshining manba qatoriga necha marta qo'llanilishini aniqlaydi. Quyida tushuntirishlar keltirilgan:

chegara > 0

chegara -1 marta qo'llaniladi . Bunday holda, massivning uzunligi chegara qiymatidan oshmaydi . Massivning oxirgi elementi topilgan oxirgi ajratuvchidan keyingi satr qismi bo'ladi. Misol:
public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output:
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

chegara < 0

Ajratuvchi qidiruv namunasi satrga imkon qadar ko'p marta qo'llaniladi. Olingan massivning uzunligi har qanday bo'lishi mumkin. Misol:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]

        Note that the last element of the array is
        an empty string, resulting from the space
        at the end of the original string.
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

chegara 0

Chegara < 0 bo'lgani kabi , chegaralovchi naqsh imkon qadar ko'p marta satrga qo'llaniladi. Olingan massiv har qanday uzunlikda bo'lishi mumkin. Agar oxirgi elementlar bo'sh qatorga teng bo'lsa, ular oxirgi massivda o'chiriladi. Misol:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Agar biz split usulini bitta argument bilan amalga oshirishni ko'rib chiqsak , bu usul o'zining haddan tashqari yuklangan birodarini ikkinchi nol argumenti bilan chaqirishini ko'ramiz:
public String[] split(String regex) {
    return split(regex, 0);
}

Turli misollar

Ish amaliyotida, ba'zida bizda ma'lum qoidalarga muvofiq tuzilgan chiziq borligi sodir bo'ladi. Ushbu qator istalgan joydan bizning dasturimizga "kirishi" mumkin:
  • uchinchi tomon xizmatidan;
  • serverimizga so'rovdan;
  • konfiguratsiya faylidan;
  • va hokazo.
Odatda bunday vaziyatda dasturchi "o'yin qoidalari" ni biladi. Aytaylik, dasturchi foydalanuvchi to'g'risidagi ma'lumotlarga ega ekanligini biladi, u ushbu naqsh bo'yicha saqlanadi:
user_id|user_login|user_email
Masalan, aniq qiymatlarni olaylik:
135|bender|bender@gmail.com
Va endi dasturchi foydalanuvchiga elektron pochta xabarini yuboradigan usulni yozish vazifasi bilan duch keladi. Uning ixtiyorida yuqoridagi formatda qayd etilgan foydalanuvchi haqidagi ma'lumotlar mavjud. Xo'sh, biz tahlil qilishni davom ettiradigan kichik vazifa elektron pochta manzilini foydalanuvchi haqidagi umumiy ma'lumotlardan ajratishdir. Bu split usuli foydali bo'lishi mumkin bo'lgan bir misol . Axir, agar shablonni ko'rib chiqsak, biz tushunamizki, foydalanuvchining elektron pochta manzilini barcha ma'lumotlardan ajratib olish uchun biz faqat ajratish usuli yordamida chiziqni ajratishimiz kerak . Keyin elektron pochta manzili olingan massivning oxirgi elementida bo'ladi. Keling, foydalanuvchi haqidagi ma'lumotlarni o'z ichiga olgan qatorni oladigan va foydalanuvchining elektron pochtasini qaytaradigan bunday usulga misol keltiraylik. Soddalashtirish uchun, keling, ushbu satr har doim bizga kerak bo'lgan formatga mos keladi deb faraz qilaylik:
public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
Ajratuvchiga e'tibor bering: "\\|" . Muntazam iboralarda “|” - bu ma'lum bir mantiq bog'langan maxsus belgi; uni oddiy belgi sifatida ishlatish uchun (biz manba qatorida topmoqchi bo'lgan belgi) ikkita teskari chiziq yordamida bu belgidan qochishimiz kerak. Keling, yana bir misolni ko'rib chiqaylik. Aytaylik, bizda taxminan shunday formatda yozilgan buyurtma haqida ma'lumot bor:
buyum_raqami,buyum_nomi_1,buyum_narxi_1;buyum_raqami,buyum_nomi_2,buyum_narxi_2;...;buyum_raqami_n,buyum_nomi_n,buyum_narxi_n
Yoki aniq qiymatlarni olaylik:
1, bodring, 20,05; 2, pomidor, 123,45; 3, quyon, 0,50
Biz buyurtmaning umumiy qiymatini hisoblash vazifasi bilan duch kelamiz. Bu erda biz split usulini bir necha marta ishlatishimiz kerak bo'ladi . Birinchi qadam qatorni ";" belgisi orqali uning tarkibiy qismlariga bo'lishdir. Keyin har bir bunday qismda biz kelajakda qayta ishlashimiz mumkin bo'lgan individual mahsulot haqida ma'lumotga ega bo'lamiz. Va keyin, har bir mahsulot ichida biz ma'lumotlarni "," belgisidan foydalanib ajratamiz va natijada olingan massivdan ma'lum bir indeksga ega (narx saqlanadi) elementni olamiz, uni raqamli shaklga aylantiramiz va yakuniy narxni tuzamiz. buyurtmaning. Bularning barchasini hisoblaydigan usulni yozamiz:
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1, cucumbers, 20.05; 2, tomatoes, 123.45; 3, hares, 0.50";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 144.0
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
Ushbu usul qanday ishlashini o'zingiz aniqlashga harakat qiling. Ushbu misollarga asoslanib aytishimiz mumkinki, bo'linish usuli bizda satr shaklida ba'zi ma'lumotlarga ega bo'lganda qo'llaniladi, undan aniqroq ma'lumot olishimiz kerak.

Natijalar

Biz String sinfining split usulini ko'rib chiqdik . Maxsus ajratgich yordamida satrni uning tarkibiy qismlariga bo'lish kerak. Usul qatorlar qatorini qaytaradi (string komponentlari). Ajratuvchi belgi(lar)ni topuvchi muntazam ifodani qabul qiladi. Biz ushbu usulning turli nozikliklarini ko'rib chiqdik:
  • yetakchi ajratuvchi belgi;
  • haddan tashqari yuklangan birodar ikkita argument bilan.
Shuningdek, biz ba'zi "haqiqiy hayot" vaziyatlarni taqlid qilishga harakat qildik, ularda biz uydirma bo'lsa-da, lekin juda real muammolarni hal qilish uchun bo'linish usulidan foydalanganmiz.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION