JavaRush /Java блогу /Random-KY /Javaдагы бөлүү ыкмасы: сапты бөлүктөргө бөлүү

Javaдагы бөлүү ыкмасы: сапты бөлүктөргө бөлүү

Группада жарыяланган
Келгиле, String split ыкмасы жөнүндө сүйлөшөлү : ал эмне кылат жана эмне үчүн керек. Ал жипти бөлөрүн болжолдоо оңой, бирок иш жүзүндө ал кандай иштейт? Келгиле, методдун кантип иштээрин кененирээк карап чыгалы жана ачык эмес деталдарды талкуулайлы жана ошол эле учурда String классында канча бөлүү ыкмалары бар экенин билели. Кеттик!

Java String.split үчүн аныктама жана кол коюу

Javaдагы бөлүү ыкмасы сапты кадимки туюнтма аркылуу белгиленген бөлгүчтү колдонуу менен ички саптарга бөлөт. Келгиле, методго кол коюп, сууга түшүүнү баштайлы:
String[] split(String regex)
Кол коюудан эки нерсе айкын көрүнүп турат:
  1. Метод саптардын массивин кайтарат.
  2. Метод параметр катары regex сапты алат.
Келгиле, жогоруда берилген аныктама боюнча ар бир нерсени өзүнчө карап көрөлү.
  1. Метод саптардын массивин кайтарат.

    Аныктама төмөнкү сөздөрдү камтыйт: " Javaдагы бөлүү ыкмасы сапты субсаптарга бөлөт." Бул субсаптар массивге метод менен чогултулат жана анын кайтаруу маанисин билдирет.

  2. Метод параметр катары regex сапты алат.

    Дагы бир жолу, аныктаманы эстеңиз: "кадимки туюнтма аркылуу көрсөтүлгөн бөлгүчтү колдонуу менен сапты ички саптарга бөлөт." Кабыл алынган regex параметри булак сапка колдонулуучу жана булак сапындагы бөлүүчү белгиге (же символдордун айкалышы) дал келген кадимки туюнтма үлгүсү.

Javaдагы бөлүү ыкмасы: сапты бөлүктөргө бөлүү - 1

Практикада бөлүү

Эми ишке киришели. Келгиле, бизде сөздөр менен жип бар деп элестетип көрөлү. Мисалы, бул сыяктуу:
Мен Javaны жакшы көрөм
Биз сапты сөзгө бөлүшүбүз керек. Бул сапта сөздөр бири-биринен боштуктар менен ажыратылганын көрөбүз. Космос бул учурда сепаратордун ролуна идеалдуу талапкер. Бул көйгөйдү чечүү үчүн code ушундай көрүнөт:
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);
        }
    }
}
Негизги ыкманын натыйжасы төмөнкү саптар болот:
Мен Javaны жакшы көрөм
Бөлүнүү ыкмасы кандайча иштей турганына дагы бир нече мисалдарды карап көрөлү :
Line Бөлгүч Методдун натыйжасы
"Мен Javaны сүйөм" " " (бостук белгиси) { "Мен" , "сүйүү" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Кызыл, кызгылт сары, сары" "," { "Кызыл" , "кызгылт сары" , "сары" }
"Кызыл, кызгылт сары, сары" ", " { "Кызыл" , "кызгылт сары" , "сары" }
Жогорудагы tableдагы акыркы эки саптын ортосундагы айырмачылыктарга көңүл буруңуз. Акыркы сапта бөлүүчү үтүр болуп саналат, ошондуктан сап кээ бир сөздөрдө алдыңкы боштуктар тургандай бөлүнөт. Акыркы сапта бөлүүчү катары үтүр жана боштук белгисин колдондук. Демек, алынган массивде алдыңкы боштуктары бар сызыктар болгон эмес. Бул кылдаттык менен туура сепараторду тандоо канчалык маанилүү экенин көрсөткөн кичинекей бир деталь.

Алдынкы бөлгүч

Дагы бир маанилүү нюанс бар. Эгерде булак сап бөлгүч менен башталса, анда алынган массивдин биринчи элементи бош сап болот. Мисалда, ал төмөнкүдөй көрүнөт: Булак сап: "Мен Java'ны сүйөм" Бөлгүч: " " Натыйжадагы массив: { "" , "I" , "love" , "Java" } Бирок булак сап бөлгүч менен бүтсө жана башталбаса, натыйжа башкача болот: Булак сап: "I love Java" Бөлүүчү: " " Натыйжадагы массив: { "I" , "love" , "Java" } Биз codeду бөлүү методунун вариацияларын карайбыз булак саптын аягында жана/же башында бөлүүчү белги менен:
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));
    }
}
Негизги ыкманын натыйжасы төмөнкүдөй болот:
[I, love, Java] [, I, love, Java] [I, love, Java] [, I, love, Java]
Дагы бир жолу көңүл буруңуз, качан булак сапындагы биринчи символ бөлүүчү символ болсо, натыйжада массив анын биринчи элементи катары бош сапка ээ болот.

Ашыкча жүктөм

String классында бул кол тамга менен дагы бир бөлүү ыкмасы бар :
String[] split(String regex, int limit)
Бул ыкманын кошумча чектөө параметри бар: ал regex үлгүсү булак сапка канча жолу колдонула турганын аныктайт . Төмөндө түшүндүрмөлөр келтирилген:

чек > 0

чектөө -1 жолу колдонулат . Бул учурда массивдин узундугу чектик мааниден ашпайт . Массивдин акыркы элементи саптын акыркы табылган бөлгүчтөн кийинки бөлүгү болот. Мисал:
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));
    }
}

чек < 0

Бөлүүчү издөө үлгүсү сапка мүмкүн болушунча көп жолу колдонулат. Алынган массивдин узундугу каалаган болушу мүмкүн. Мисал:
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));
    }
}

чек 0

Чек < 0 болгон сыяктуу , бөлүүчү үлгү сапка мүмкүн болушунча көп жолу колдонулат. Натыйжада массив каалаган узундукта болушу мүмкүн. Эгерде акыркы элементтер бош сапка барабар болсо, алар акыркы массивде жок кылынат. Мисал:
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));
    }
}
Эгерде бөлүү ыкмасын бир аргумент менен ишке ашырууну карай турган болсок , анда бул ыкма өзүнүн ашыкча жүктөлгөн бир тууганын экинчи нөл аргументи менен чакырарын көрөбүз:
public String[] split(String regex) {
    return split(regex, 0);
}

Ар кандай мисалдар

Иш практикасында кээде бизде белгилүү бир эрежелер боюнча түзүлгөн линия болот. Бул сап каалаган жерден биздин программага "кире" алат:
  • үчүнчү тараптын кызматынан;
  • биздин serverге кайрылуудан;
  • конфигурация файлынан;
  • жана башкалар.
Адатта, мындай кырдаалда программист "оюндун эрежелерин" билет. Программист колдонуучу тууралуу маалыматы бар экенин билет деп коёлу, ал маалымат ушул калыпка ылайык сакталат:
user_id|user_login|user_email
Мисалы, конкреттүү баалуулуктарды алалы:
135|bender|bender@gmail.com
Эми программисттин алдында милдет турат: колдонуучуга электрондук кат жөнөтүүчү ыкманы жазуу. Анын карамагында жогоруда көрсөтүлгөн форматта жазылган колдонуучу жөнүндө маалымат бар. Ооба, биз талдоону уланта турган кошумча тапшырма - бул электрондук почтанын дарегин колдонуучу жөнүндө жалпы маалыматтан бөлүп алуу. Бул бөлүү ыкмасы пайдалуу боло турган бир мисал . Кантсе да, шаблонду карасак, колдонуучунун электрондук почта дарегин бардык маалыматтардан алуу үчүн, бөлүү ыкмасын колдонуп, сызыкты бөлүү керек экенин түшүнөбүз . Андан кийин электрондук почтанын дареги алынган массивдин акыркы элементинде болот. Колдонуучу жөнүндө маалыматты камтыган сапты алып, колдонуучунун электрондук почтасын кайтарган мындай ыкмага мисал келтирели. Жөнөкөйлөтүү үчүн, бул сап дайыма бизге керектүү форматка дал келет деп ойлойлу:
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]
    }
}
Бөлүүчүгө көңүл буруңуз: "\\|" . Анткени кадимки сөз айкаштарында “|” - бул белгилүү бир логика байланган өзгөчө белги; аны кадимки символ катары колдонуу үчүн (биз булак саптан тапкыбыз келген), эки арткы сызык аркылуу бул белгиден качышыбыз керек. Дагы бир мисалды карап көрөлү. Бизде болжол менен ушул форматта жазылган буйрук тууралуу маалымат бар дейли:
буюмдун_номери_1,буюмдун_аты_1,буюмдун_баасы_1;пункт_номери_2,заттын_аты_2,пункт_баасы_2;...;пункт_номери_n, буюмдун_аты_n, буюмдун_баасы_n
Же конкреттүү баалуулуктарды алалы:
1, бадыраң, 20,05; 2, помидор, 123,45; 3, коён, 0,50
Биздин алдыбызда заказдын жалпы наркын эсептөө милдети турат. Бул жерде бөлүү ыкмасын бир нече жолу колдонууга туура келет . Биринчи кадам ";" белгиси аркылуу сапты анын курамдык бөлүктөрүнө бөлүү болуп саналат. Андан кийин ар бир мындай бөлүктө биз келечекте иштете турган жеке продукт жөнүндө маалыматка ээ болобуз. Анан ар бир продукттун ичинде биз маалыматты "," символу аркылуу бөлүп алабыз жана алынган массивден белгилүү бир индекси бар элементти (баасы сакталган) алып, аны сандык формага которуп, акыркы наркын түзөбүз. буйруктун. Мунун баарын эсептей турган ыкманы жазалы:
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;
    }
}
Бул ыкма кантип иштээрин өзүңүз түшүнүүгө аракет кылыңыз. Бул мисалдарга таянып, бөлүү ыкмасы бизде сап түрүндө кандайдыр бир маалымат болгондо колдонулат, андан конкреттүүраак маалымат алуу керек деп айта алабыз .

Жыйынтыктар

Биз String классынын бөлүү ыкмасын карадык . Атайын бөлгүчтү колдонуу менен сапты анын курамдык бөлүктөрүнө бөлүү керек. Метод саптардын массивдерин (саптын компоненттерин) кайтарат. Бөлүүчү белги(лерди) таба турган туруктуу сөз айкашын кабыл алат. Биз бул ыкманын ар кандай кылдат жактарын карап чыктык:
  • негизги бөлүүчү белги;
  • эки аргумент менен ашыкча жүктөлгөн бир тууган.
Биз ошондой эле ойдон чыгарылган, бирок абдан реалдуу маселелерди чечүү үчүн бөлүү ыкмасын колдонгон кээ бир “чыныгы жашоодогу” кырдаалдарды окшоштурууга аракет кылдык .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION