Розуміння підрядка в Java: базовий посібник

У цій статті ми допоможемо вам зрозуміти підрядки в Java. Ми не лише дамо вам теоретичне пояснення, але й надамо реальні приклади коду, щоб допомогти вам уявити. Ми навчимо вас створювати підрядки та допоможемо знайти підрядки всередині рядка.

Але перш ніж вивчати їх, ми повинні знати основи підрядків.

Що таке рядки та підрядки?

У контексті Java рядок представляє послідовність символів. Кожен рядок в Java є об’єктом. Рядок у Java може містити символи, символи та навіть пробіли. З іншого боку, підрядок у Java є частиною або підмножиною рядка Java.

Наприклад, «Geek» є підрядком «techukraine.net». Підрядки допомагають отримати певну частину рядка.

Якщо у вас є ім’я «Джон Доу» і вам потрібно лише ім’я «Джон», ви можете легко отримати його за допомогою підрядків. Крім того, враховуючи, що у вас є список імен «Джон, Джек, Веселий» і ви хочете дізнатися, чи є в ньому «Джон», ви також можете зробити це за допомогою підрядків. Це лише прості приклади. Ми можемо використовувати підрядки в різних операціях, коли ми їх зрозуміємо.

Оскільки ми вже знаємо концепцію підрядків у Java, тепер давайте дізнаємося, як створювати та працювати з підрядками в Java.

#1. Використання методу ‘substring()’

Метод «substring()» дозволяє дуже легко створювати підрядки. Він приймає до двох параметрів як вхідні дані – startIndex або обидва startIndex і endIndex і повертає нам потрібний підрядок.

Залежно від кількості параметрів ми можемо використовувати його двома способами. Тепер давайте розберемося з ними докладніше.

підрядок (int startIndex)

Для початку ми можемо використати метод у формі ‘substring(startIndex)’. Тут цей метод приймає ціле число як вхідні дані, де вхідні дані є початковою позицією підрядка. Він повертає рядок, починаючи з наданого початкового індексу до кінця вихідного рядка.

Як приклад, давайте розглянемо наступний код:

public class Substrings{    
    public static void main(String args[]){    
    String str="techukraine.net";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4)); //index of strings start from 0
    }  
   }

ВИХІД:

Given String: techukraine.net
Substring: Flare

З результату ми бачимо, що вхідний рядок – «techukraine.net», а значення, що повертається, є підрядком «Flare». Він створює підрядок із заданого індексу (4), тобто від позиції 5 до кінця рядка.

підрядок (int startIndex, int endIndex)

Це ще один спосіб використання методу substring класу String. Ми можемо передати два цілих числа в метод substring. Початковий і кінцевий індекс. Щоб скористатися цим, ми маємо використати метод у форматі «підрядок(початковийІндекс,кінцевийІндекс)».

Щоб краще зрозуміти це, давайте розглянемо приклад коду:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareFans";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4,9));  //You get a substring starting from index no. 4 to index 8.

    }  
   }

ВИХІД:

Given String: GeekFlareFans
Substring: Flare

Як ми бачимо, враховуючи рядок “GeekFlareFans”, він виводить підрядок “Flare”. Ми вказали початковий індекс 4 і кінцевий індекс 9. Він починається з елемента з індексом 4 і закінчується перед 9. Слід зазначити, що він не друкує елемент з кінцевим індексом. Це дає нам підрядок, який включає всі елементи до кінцевого індексу, але виключає елемент із кінцевим індексом.

#2. Використання методу split().

«split()» — це ще один метод класу String у Java, який допомагає нам створити підрядок. Це корисно, коли кілька частин інформації зберігаються в одному рядку із загальним роздільником.

У синтаксисі згадується термін «регулярний вираз», який може здатися вам трохи лякаючим, тому давайте розберемося, що таке регулярний вираз, перш ніж продовжити. Regex — це короткий термін для «регулярних виразів». Регулярний вираз — це послідовність символів, яка описує шаблон у рядку або тексті. У контексті методу split нашим роздільником є ​​регулярний вираз.

Метод split() може приймати до двох змінних як вхідні дані, це рядок регулярного виразу та обмежене ціле число. Регулярний вираз — це роздільник, який, коли знайдено, призводить до розбиття вихідного рядка на 2 частини — частину перед регулярним виразом і частину після регулярного виразу.

Наприклад, припустімо, що ви намагаєтеся розділити рядок «abcdef» на «bcd» як регулярний вираз. У результаті ми отримаємо підрядки «a» і «ef».

Метод повертає масив із розділеними рядками. Ми можемо вказати лише регулярний вираз або і регулярний вираз, і обмеження. Давайте познайомимося з кількома способами виклику цього методу один за іншим.

split (рядок регулярного виразу)

Перший метод отримує лише рядок регулярного виразу у форматі «split(regex)». Він не має граничної змінної; тому повертає всі розділені підрядки в масиві.

Давайте отримаємо чітке розуміння за допомогою коду:

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("%");
    System.out.println("Given String: " + str);
    System.out.println("First Substring: " + substrings[0]);
    System.out.println("Second Substring: " + substrings[1]);
     
    }  
}

ВИХІД:

Given String: Geek%Flare
First Substring: Geek
Second Substring: Flare

Як видно з коду, заданий рядок має регулярний вираз-роздільник «%». Це не обов’язково один символ, це може бути будь-який рядок із будь-якою кількістю символів. Метод split() ігнорує цей регулярний вираз і дає нам усі рядки, які були розділені цим регулярним виразом. Підрядки зберігаються всередині масиву.

У коді вказаний рядок «Geek%Flare». Отже, ми отримуємо масив із двома елементами, які є «Geek» і «Flare». Пізніше ми отримали доступ до них із відповідними індексами, які дорівнюють 0,1 відповідно, і ми надрукували «Geek» і «Flare» на консолі.

Тут також слід зазначити, що якщо методу не передано жодних параметрів, він просто видасть помилку. Але якщо ми дамо порожній рядок (“”) як регулярний вираз, ми отримаємо кожен окремий символ як підрядок. Давайте розглянемо приклад для візуалізації.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("");
    System.out.println(Arrays.toString(substrings));
     
    }  
}

ВИХІД:

[G, e, e, k, %, F, l, a, r, e]

З прикладу очевидно, що параметр регулярного виразу є порожнім рядком, він повертає всі символи як окремі підрядки, і ми можемо це чітко побачити, надрукувавши вихідний масив методу ‘split()’.

split (рядок регулярного виразу, обмеження int)

За допомогою другого варіанту цього методу ми отримуємо більше контролю над виводом і можемо додатково налаштувати вивід методу split(). Тут метод split() приймає дві змінні як вхідні дані. У цьому випадку разом із регулярним виразом ми також надаємо параметр limit у вказаному форматі «split(regex, limit)».

«Обмеження» — це кількість кінцевих рядків, які виводяться. Залежно від значення ліміту може бути три варіанти:

Випадок 1: якщо limit>0, результуючий масив міститиме вихідні дані, але він застосовуватиме розділення (ліміт-1) щонайбільше. Тут результуючий масив не міститиме більше елементів, ніж указане обмеження, а всі залишкові рядки, які не розділені, зберігатимуться як були. Давайте полегшимо розуміння за допомогою коду.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%the%best";
    String[] substrings=str.split("%",2);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

ВИХІД:

[Geek, Flare%is%the%best]

Подивіться у вихідних даних, як у масиві результатів є лише два елементи, які є числом, указаним у параметрі limit. Крім того, зауважте, що розділення застосовано лише один раз, тому (ліміт-1) разів.

Однак, якщо регулярний вираз є два рази поспіль («%%»), він матиме порожні підрядки. Подивіться на цей фрагмент коду, щоб краще зрозуміти його.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",5);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

ВИХІД:

[Geek, Flare, is, , the%best%%%]

Загалом, якщо за «%» йде інший «%» або кінець рядка, він перетворюється на порожній підрядок.

Випадок 2: якщо обмеження <0, дію розділення буде застосовано стільки разів, скільки можливо, без обмеження розміру масиву, але масив міститиме порожні підрядки, якщо регулярний вираз є два рази поспіль («%%»).

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",-1);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

ВИХІД:

[Geek, Flare, is, , the, best, , , ]

З результату видно, що розділення застосовано стільки разів, скільки можливо, а також є порожні підрядки.

Випадок 3: якщо limit=0, дію розділення також буде застосовано стільки разів, скільки можливо, але тут усі порожні підрядки в кінці рядка буде відкинуто з масиву.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",0);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

ВИХІД:

[Geek, Flare, is, , the, best]

Ми бачимо, що вихідні дані дуже схожі між limit=-1 і limit=0, але в кінці немає порожніх підрядків. Іншими словами, порожні підрядки в кінці масиву підрядків ігноруються.

Також зауважте, що якщо регулярний вираз відсутній у рядку, він повертає весь оригінальний рядок як результат.

Знайти, чи містить рядок підрядок

Окрім створення підрядків із існуючих рядків, ми також можемо вказати підрядок і дізнатися, чи існує цей підрядок усередині рядка. Це швидкий і простий спосіб запиту підрядка, і це корисно в багатьох випадках використання. Але як нам це зробити? Досягти цього нам можуть різні методи. Давайте переглянемо їх один за іншим.

Використання методу ‘contains()’:

Ми можемо дуже легко знайти існування підрядка за допомогою методу ‘contains()’. Цей метод класу String приймає рядок як вхідні дані, який є нашим підрядком, і повертає логічне значення, перевіряючи, чи є підрядок усередині рядка чи ні. Цей метод можна використовувати всередині блоків if-else, унарних операторів та інших місць для реалізації складної логіки.

Давайте познайомимося з цим методом трохи більше.

public class Substrings{    
    public static void main(String args[]){    
    String str="techukraine.net";    
    System.out.println("Does it contain Flare? n"+ str.contains("Flare"));  
    }  
}

ВИХІД:

Does it contain Flare? 
true

Код перевіряє рядок «techukraine.net» на наявність слова «Flare» і, успішно знаходячи його, повертає логічне значення «true», таким чином підтверджуючи існування підрядка.

public class Substrings{    
    public static void main(String args[]){    
    String str="techukraine.net";    
    System.out.println("Does it contain Flare? n"+ str.contains("Flare1"));  
    }  
}

ВИХІД:

Does it contain Flare? 
false

З прикладу ми розуміємо, що якщо підрядка немає всередині рядка, метод поверне false, щоб означити його відсутність. Тому ми можемо легко переконатися, що підрядок існує.

Знаходження позиції підрядка

#1. Використання ‘indexOf()’:

Метод «indexOf()» можна використовувати, щоб знайти підрядок, а також знайти його індекс. Метод приймає як вхідні дані рядок або символ і дає нам позицію його першого входження. Але він може надати нам лише індекс першого входження та не може підтвердити, чи існують інші випадки цього. Ще одна річ, на яку слід звернути увагу: якщо підрядок не існує, метод повертає -1.

Тож давайте вивчимо цей метод трохи докладніше.

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Index of Flare: "+ str.indexOf("Flare"));  
    }  
}

ВИХІД:

Index of Flare: 4

Тут у прикладі перше входження підрядка «Flare» починається з індексу 4 у рядку «GeekFlareGeekFlare». Отже, як і очікувалося, функція повернула індекс.

#2. Використання ‘lastIndexOf()’:

‘lastIndexOf()’ дуже схожий на ‘indexOf()’. Обидва ці методи беруть як вхідні дані підрядок і повертають індекс його позиції. Він навіть повертає те саме значення, коли не може знайти підрядок у вказаному рядку. Обидва ці методи повертають -1 у разі невдалого пошуку.

Але тоді як «indexOf()» повертає індекс першого входження підрядка, «lastIndexOf()» повертає останній входження.

Давайте подивимося на це в дії через код:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Last index of Flare: "+ str.lastIndexOf("Flare"));  
    }  
}

ВИХІД:

Last index of Flare:13

Спостерігаючи за цим виходом, ми розуміємо, що метод ‘lastIndexOf()’ поводиться як очікувалося, і ми отримуємо індекс останнього входження підрядка «Flare» у рядку «GeekFlareGeekFlare».

поширені запитання

Як використовувати метод split() для створення непорожніх підрядків?

Якщо є кілька екземплярів рядка регулярного виразу в основному рядку один за одним («Hello%%Hi», де регулярний вираз — «%»), метод split() розглядає перший екземпляр як символ розриву, а решта видає порожній рядок. Щоб пом’якшити це, ми можемо вказати параметр limit як 0. Отже, він видаватиме лише непорожні рядки як вихідні дані.

Чи повертає «indexOf()» індекси всіх екземплярів підрядка?

Ні, ‘indexOf()’ не повертає індекси всіх екземплярів підрядка. За допомогою ‘indexOf()’ ми отримуємо ціле число, що повертається, що містить індекс першого входження підрядка. Але якщо він не може знайти підрядок, метод поверне -1.

Що повертає метод ‘substring()’, якщо дані індекси не існують у рядку?

Якщо заданий початковий і кінцевий індекси не існують у рядку, компілятор видасть помилку. Помилка має містити «java.lang.StringIndexOutOfBoundsException: », і вона просто не виконається.

Висновок

У цій статті ми обговорили різні методи та основи для початку роботи з підрядками. Ми обговорювали створення підрядка та перевірку існування підрядка в рядку. Це дасть вам краще розуміння того, як працювати з підрядками. Дотримуйтесь прикладів і більше практикуйтеся, щоб отримати повне розуміння підрядків.

Далі ви можете переглянути наш список запитань для співбесіди на Java.