JavaRush /Java блогы /Random-KK /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 тілін жақсы көремін
Бөлу әдісінің қалай жұмыс істейтіні туралы тағы бірнеше мысалды қарастырайық :
Түзу Бөлгіш Әдістің нәтижесі
«Мен Java-ны жақсы көремін» " " (бос орын таңбасы) { "Мен" , "сүйемін" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
«Қызыл, қызғылт сары, сары» "," { "Қызыл" , "қызғылт сары" , "сары" }
«Қызыл, қызғылт сары, сары» ", " { "Қызыл" , "қызғылт сары" , "сары" }
Жоғарыдағы кестедегі соңғы екі жолдың айырмашылығына назар аударыңыз. Соңғы жолдағы бөлгіш үтір болып табылады, сондықтан жол кейбір сөздерде алдыңғы бос орындар болатындай етіп бөлінген. Соңғы жолда бөлгіш ретінде үтір мен бос орын таңбасын қолдандық. Сондықтан алынған массивте алдыңғы бос орындар бар жолдар болмады. Бұл дұрыс бөлгішті мұқият таңдаудың қаншалықты маңызды екенін көрсететін шағын деталь ғана.

Жетекші бөлгіш

Тағы бір маңызды нюанс бар. Егер бастапқы жол бөлгіштен басталса, нәтиже массивінің бірінші элементі бос жол болады. Мысалда ол келесідей болады: Бастапқы жол: "Мен Java-ны жақсы көремін" Бөлгіш: " " Нәтижедегі массив: { "" , "I" , "love" , "Java" } Бірақ бастапқы жол бөлгішпен аяқталса және басталмаса, нәтиже басқаша болады: Бастапқы жол: "Мен 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));
    }
}
Негізгі әдістің нәтижесі келесідей болады:
[Мен, махаббат, Java] [, мен, махаббат, Java] [Мен, махаббат, Java] [, мен, махаббат, 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 класының split әдісін қарастырдық . Арнайы бөлгіштің көмегімен жолды оның құрамдас бөліктеріне бөлу үшін қажет. Әдіс жолдар массивін (жолдың құрамдас бөліктері) қайтарады. Бөлгіш таңба(лар)ды табатын тұрақты өрнекті қабылдайды. Біз бұл әдістің әртүрлі нәзіктіктерін қарастырдық:
  • жетекші бөлгіш таңба;
  • екі аргументпен шамадан тыс жүктелген ағайын.
Біз сондай-ақ ойдан шығарылған, бірақ өте шынайы мәселелерді шешу үшін бөлу әдісін қолданатын кейбір «нақты өмірлік» жағдайларды модельдеуге тырыстық .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION