JavaRush /Java Blogu /Random-AZ /Java-da bölmə metodu: sətri hissələrə bölmək

Java-da bölmə metodu: sətri hissələrə bölmək

Qrupda dərc edilmişdir
Gəlin String split metodu haqqında danışaq : o nə edir və nə üçün lazımdır. Onun simi böldüyünü təxmin etmək asandır, amma praktikada bu necə işləyir? Gəlin metodun necə işlədiyinə daha yaxından nəzər salaq və bəzi qeyri-aşkar detalları müzakirə edək və eyni zamanda String sinfində əslində neçə bölünmə metodunun olduğunu öyrənək. Gedək!

Java String.split üçün tərif və imza

Java-dakı split metodu, adi ifadədən istifadə edərək təyin olunan ayırıcıdan istifadə edərək sətri alt sətirlərə ayırır. Metod imzasını verək və dalışımıza başlayaq:
String[] split(String regex)
İmzadan iki şey aydın görünür:
  1. Metod bir sıra sətirləri qaytarır.
  2. Metod parametr kimi regex sətrini götürür.
Yuxarıda verilmiş tərif baxımından hər bir şeyə ayrıca baxaq.
  1. Metod bir sıra sətirləri qaytarır.

    Tərifdə aşağıdakı sözlər var: “ Java-da split metodu sətri alt sətirlərə ayırır.” Bu alt sətirlər metodla massivdə toplanır və onun qaytarılması dəyərini təmsil edir.

  2. Metod parametr kimi regex sətrini götürür.

    Yenə tərifi xatırlayın: "müntəzəm ifadədən istifadə edərək müəyyən edilmiş bir ayırıcıdan istifadə edərək sətri alt sətirlərə ayırır." Qəbul edilən regex parametri mənbə sətirinə tətbiq edilən və mənbə sətirindəki ayırıcı xarakterə (və ya simvolların birləşməsinə) uyğun gələn müntəzəm ifadə nümunəsidir.

Java-da bölmə metodu: sətri hissələrə bölmək - 1

Praktikada bölün

İndi işə başlayaq. Təsəvvür edək ki, sözlərdən ibarət bir simimiz var. Məsələn, bu kimi:
Mən Java-nı sevirəm
Biz sözlərə simli parçalamalıyıq. Bu sətirdə sözlərin bir-birindən boşluqlarla ayrıldığını görürük. Kosmos bu halda ayırıcı rol üçün ideal namizəddir. Bu problemi həll etmək üçün kod belə görünür:
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);
        }
    }
}
Əsas metodun çıxışı aşağıdakı sətirlər olacaq:
Mən Java-nı sevirəm
Split metodunun necə işlədiyinə dair daha bir neçə nümunəyə baxaq :
Xətt Ayırıcı Metodun nəticəsi
"Mən Java-nı sevirəm" " " (boşluq simvolu) { "Mən" , "sevgi" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Qırmızı, narıncı, sarı" "," { "Qırmızı" , "narıncı" , "sarı" }
"Qırmızı, narıncı, sarı" ", " { "Qırmızı" , "narıncı" , "sarı" }
Yuxarıdakı cədvəldə son iki sıra arasındakı fərqlərə diqqət yetirin. Sondan əvvəlki sətirdə ayırıcı vergüldür, ona görə də sətir elə bölünür ki, bəzi sözlərdə aparıcı boşluqlar olsun. Sonuncu sətirdə ayırıcı kimi vergül və boşluq simvolundan istifadə etdik. Buna görə də, yaranan massiv aparıcı boşluqları olan heç bir sətirdən ibarət deyildi. Bu, düzgün ayırıcının diqqətlə seçilməsinin nə qədər vacib olduğunu nümayiş etdirən kiçik bir detaldır.

Aparıcı ayırıcı

Daha bir vacib nüans var. Əgər mənbə sətri ayırıcı ilə başlayırsa, nəticədə yaranan massivin ilk elementi boş sətir olacaqdır. Nümunədə bu belə görünəcək: Mənbə sətri: "Mən Java-nı sevirəm" Ayrıcı: " " Nəticə massivi: { "" , "I" , "love" , "Java" } Amma mənbə sətri ayırıcı ilə bitirsə və başlamazsa, nəticə fərqli olacaq: Mənbə sətri: "Mən Java-nı sevirəm" Separator: " " Nəticə massivi: { "I" , "love" , "Java" } Split metodunun variasiyalarına kodda baxaq mənbə sətirinin sonunda və/və ya əvvəlində ayırıcı simvol ilə:
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));
    }
}
Əsas metodun çıxışı belə olacaq:
[I, love, Java] [, I, love, Java] [I, love, Java] [, I, love, Java]
Bir daha qeyd edək ki, mənbə sətirindəki ilk simvol ayırıcı simvol olduqda, nəticədə yaranan massiv ilk element kimi boş sətirə sahib olacaq.

Həddindən artıq yüklənmiş yoldaş

String sinfində bu imza ilə başqa bir bölmə metodu var :
String[] split(String regex, int limit)
Bu metodun əlavə limit parametri var: o, regex modelinin mənbə sətrinə neçə dəfə tətbiq olunacağını müəyyənləşdirir . Aşağıda izahatlar verilmişdir:

limit > 0

limit -1 dəfə tətbiq edilir . Bu halda massivin uzunluğu limit dəyərini keçməyəcək . Massivin son elementi tapılan sonuncu ayırıcıdan sonrakı sətir hissəsi olacaq. Misal:
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));
    }
}

limit < 0

Ayırıcı axtarış nümunəsi sətirə mümkün qədər çox tətbiq edilir. Yaranan massivin uzunluğu istənilən ola bilər. Misal:
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));
    }
}

limit 0

Limit < 0 olduğu kimi , ayırıcı nümunə mümkün qədər çox dəfə sətirə tətbiq edilir. Yaranan massiv istənilən uzunluqda ola bilər. Əgər sonuncu elementlər boş sətirə bərabərdirsə, onlar son massivdə atılacaqlar. Misal:
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));
    }
}
Split metodunun bir arqumentlə həyata keçirilməsinə baxsaq , görərik ki, bu metod özünün həddən artıq yüklənmiş qardaşını ikinci sıfır arqumenti ilə çağırır:
public String[] split(String regex) {
    return split(regex, 0);
}

Müxtəlif nümunələr

İş praktikasında bəzən elə olur ki, bizdə müəyyən qaydalara uyğun tərtib edilmiş xətt olur. Bu xətt istənilən yerdən proqramımıza “daxil” edə bilər:
  • üçüncü tərəfin xidmətlərindən;
  • serverimizə sorğudan;
  • konfiqurasiya faylından;
  • və s.
Adətən belə bir vəziyyətdə proqramçı “oyun qaydalarını” bilir. Tutaq ki, proqramçı onun istifadəçi haqqında məlumatı olduğunu bilir və bu nümunəyə uyğun olaraq saxlanılır:
user_id|user_login|user_email
Məsələn, konkret dəyərləri götürək:
135|bender|bender@gmail.com
İndi isə proqramçı istifadəçiyə e-poçt göndərən metodu yazmaq vəzifəsi ilə üzləşib. Onun ixtiyarında istifadəçi haqqında yuxarıda göstərilən formatda qeyd olunan məlumatlar var. Yaxşı, təhlil etməyə davam edəcəyimiz alt vəzifə e-poçt ünvanını istifadəçi haqqında ümumi məlumatdan təcrid etməkdir. Bu, split metodunun faydalı ola biləcəyi bir nümunədir . Axı, şablona baxsaq, başa düşürük ki, istifadəçinin e-poçt ünvanını bütün məlumatlardan çıxarmaq üçün yalnız bölmə metodundan istifadə edərək xətti bölmək lazımdır . Sonra e-poçt ünvanı əldə edilən massivin son elementində olacaq. İstifadəçi haqqında məlumat ehtiva edən sətir götürən və istifadəçinin e-poçtunu qaytaran belə bir üsula misal verək. Sadələşdirmək üçün tutaq ki, bu sətir həmişə bizə lazım olan formata uyğun gəlir:
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]
    }
}
Ayırıcıya diqqət yetirin: "\\|" . Çünki müntəzəm ifadələrdə “|” - bu, müəyyən məntiqin bağlandığı xüsusi bir simvoldur; onu adi bir simvol kimi istifadə etmək üçün (mənbə sətirində tapmaq istədiyimiz simvol) iki əks xətt istifadə edərək bu simvoldan qaçmalıyıq. Başqa bir misala baxaq. Deyək ki, təxminən bu formatda yazılmış sifariş haqqında məlumatımız var:
maddə_nömrəsi_1,əşya_adı_1,əşya_qiyməti_1;maddə_nömrə_2,əşya_adı_2,əşya_qiyməti_2;...;maddə_nömrə_n,maddə_adı_n,əşya_qiyməti_n
Və ya konkret dəyərləri götürək:
1, xiyar, 20,05; 2, pomidor, 123,45; 3, dovşan, 0,50
Sifarişin ümumi dəyərini hesablamaq vəzifəsi ilə qarşılaşırıq. Burada bir neçə dəfə split metodundan istifadə etməli olacağıq . İlk addım ";" simvolu vasitəsilə sətri onun komponent hissələrinə bölməkdir. Sonra hər bir belə hissədə gələcəkdə emal edə biləcəyimiz fərdi məhsul haqqında məlumatımız olacaq. Və sonra, hər bir məhsul daxilində "," simvolundan istifadə edərək məlumatları ayıracağıq və nəticədə olan massivdən müəyyən indeksə malik (qiymətin saxlandığı) elementi götürəcəyik, onu rəqəmsal formaya çevirəcəyik və yekun dəyəri tərtib edəcəyik. sifarişin. Bütün bunları hesablayacaq bir üsul yazaq:
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;
    }
}
Bu metodun necə işlədiyini özünüz anlamağa çalışın. Bu misallara əsaslanaraq deyə bilərik ki, sətir formasında bəzi məlumatlarımız olduqda, split metodundan istifadə olunur ki, onlardan daha konkret məlumat çıxarmaq lazımdır.

Nəticələr

String sinifinin split metoduna baxdıq . Xüsusi bir ayırıcıdan istifadə edərək bir simli onun komponent hissələrinə bölmək lazımdır. Metod sətirlər massivini (sətirin komponentləri) qaytarır. Ayırıcı simvol(lar)ı tapan müntəzəm ifadəni qəbul edir. Bu metodun müxtəlif incəliklərinə baxdıq:
  • aparıcı ayırıcı xarakter;
  • iki mübahisə ilə həddindən artıq yüklənmiş qardaş.
Biz həmçinin uydurma, lakin kifayət qədər real problemləri həll etmək üçün parçalanma metodundan istifadə etdiyimiz bəzi “real həyat” vəziyyətlərini simulyasiya etməyə çalışdıq .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION