1. Порівняння рядків

Порівняння — це одна з найпопулярніших операцій із рядками. Клас String має понад десять різних методів для порівняння рядків між собою. Далі ми розглянемо вісім основних методів.

Методи Опис
boolean equals(String str)
Рядки вважаються однаковими (рівними), якщо всі їхні символи збігаються.
boolean equalsIgnoreCase(String str)
Порівнює рядки, ігноруючи регістр (розмір) літер.
int compareTo(String str)
Порівнює рядки лексикографічно. Повертає: 0, якщо рядки однакові; число менше за нуль, якщо поточний рядок менший за рядок-параметр; число більше за нуль, якщо поточний рядок більший за рядок-параметр.
int compareToIgnoreCase(String str)
Порівнює рядки лексикографічно, ігноруючи регістр літер. Повертає: 0, якщо рядки однакові; число менше за нуль, якщо поточний рядок менший за рядок-параметр; число більше за нуль, якщо поточний рядок більший за рядок-параметр.
boolean regionMatches(int toffset, String str, int offset, int len)
Порівнює частини рядків.
boolean startsWith(String prefix)
Перевіряє, чи починається поточний рядок із підрядка prefix.
boolean endsWith(String suffix)
Перевіряє, чи закінчується поточний рядок підрядком suffix.

Припустімо, нам потрібно написати програму, яка просить користувача ввести шлях до файлу й перевіряє, що це за файл, за розширенням його імені. Код такої програми матиме такий вигляд:

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

if (path.endsWith(".jpg") || path.endsWith(".jpeg"))
{
   System.out.println("Це Jpeg!");
}
else if (path.endsWith(".htm") || path.endsWith(".html"))
{
   System.out.println("Це HTML-сторінка");
}
else if (path.endsWith(".doc") || path.endsWith(".docx"))
{
   System.out.println("Це документ Word");
}
else
{
   System.out.println("Невідомий формат");
}
Створення об'єкта Scanner
Читання рядка з консолі

Перевірка, чи закінчується рядок path заданим підрядком


2. Пошук підрядків

Друга за популярністю операція після порівняння рядків — це пошук одного рядка в іншому. Для цього клас String теж має кілька методів:

Методи Опис
int indexOf(String str)
Шукає рядок str в поточному рядку. Повертає індекс першого символу знайденого рядка.
int indexOf(String str, int index)
Шукає рядок str в поточному рядку, починаючи із символу з індексом index. Повертає індекс першого символу знайденого рядка.
int lastIndexOf(String str)
Шукає рядок str в поточному рядку, починаючи з кінця. Повертає індекс першого символу знайденого рядка (тобто індекс останнього входження).
int lastIndexOf(String str, int index)
Шукає рядок str в поточному рядку ззаду наперед, починаючи із символу з індексом index; повертає індекс першого символу знайденого рядка (тобто індекс останнього входження).
boolean matches(String regex)
Перевіряє, чи збігається поточний рядок із шаблоном, який задано регулярним виразом.

Методи indexOf(String) і indexOf (String, index) часто використовуються разом. Перший дає змогу знайти перше входження переданого підрядка в поточному рядку. А другий метод знаходить друге, третє і т. д. входження завдяки тому, що пропускає перші index символів.

Припустімо, маємо таку URL-адресу: «https://domen.com/about/reviews», і хочемо замінити ім'я домену на javarush.com. Домени в URL-адресах можуть бути різними, але ми можемо виділити їх за такими ознаками:

  • Імені домену передують дві скісні риски //
  • Після імені домену ставиться одна скісна риска /

Цю програму можна написати отак:

Код Примітки
Scanner console = new Scanner(System.in);
String path = console.nextLine();

int index = path.indexOf("//");
int index2 = path.indexOf("/", index + 2);

String first = path.substring(0, index + 2);
String last = path.substring(index2);

String result = first + "javarush.com" + last;
System.out.println(result);
Створення об'єкта Scanner
Читання рядка з консолі

Отримуємо індекс першого входження рядка //
Отримуємо індекс першого входження рядка /, але шукаємо тільки після символів //.
Отримуємо рядок від початку і закінчуючи символами //
Отримуємо рядок від / і до кінця.

Склеюємо рядки і отримуємо новий домен.

Методи lastIndexOf(String) і lastIndexOf(String, index) працюють так само, тільки пошук ведеться у зворотному напрямку, починаючи з кінця рядка.



3. Створення підрядків

Наступною за популярністю після порівняння рядків і пошуку підрядків є операція отримання підрядка з рядка. У попередньому прикладі ви бачили виклик методу substring(), який повертав частину рядка.

Наводимо 8 методів отримання підрядків із поточного рядка:

Методи Опис
String substring(int beginIndex, int endIndex)
Повертає підрядок, визначений інтервалом символів beginIndex..endIndex.
String repeat(int count)
Повторює поточний рядок n разів.
String replace(char oldChar, char newChar)
Повертає новий рядок, де символ oldChar замінено на символ newChar.
String replaceFirst(String regex, String replacement)
Замінює в поточному рядку підрядок, визначений регулярним виразом, на заданий підрядок.
String replaceAll(String regex, String replacement)
Замінює в поточному рядку всі підрядки, визначені регулярним виразом, на заданий підрядок.
String toLowerCase()
Перетворює всі літери в рядку на малі.
String toUpperCase()
Перетворює всі літери в рядку на великі.
String trim()
Видаляє всі пробіли на початку та в кінці рядка.

Короткий опис цих методів:

Метод substring(int beginIndex, int endIndex)

Метод substring повертає новий рядок, який містить символи поточного рядка починаючи із символу з індексом beginIndex і закінчуючи символом до індексу endIndex. Не забувайте, що в Java інтервали не включають елементи з кінцевим індексом, тобто символ з індексом endIndex у новий рядок не входить. Приклади:

Код Результат
"Привіт".substring(0, 3);
"При"
"Привіт".substring(1, 4);
"рив"
"Привіт".substring(1, 6);
"ривіт"
"Привіт".substring(1);
"ривіт"

Якщо параметр endIndex не вказано (а так можна), вибирається підрядок починаючи від символу beginIndex і до кінця рядка.

Метод repeat(int n)

Метод repeat просто повторює поточний рядок n разів. Приклад:

Код Результат
"Привіт".repeat(3);
"ПривітПривітПривіт"
"Привіт".repeat(2);
"ПривітПривіт"
"Привіт".repeat(1);
"Привіт"
"Привіт".repeat(0);
""

Метод replace(char oldChar, char newChar)

Метод replace() повертає новий рядок, де всі символи oldChar замінено на символ newChar. Довжина рядка під час цієї операції не змінюється. Приклад:

Код Результат
"Привіт".replace('Я', 'я');
"Привіт"
"Привіт".replace('т', 'д');
"Привід"
"Привіт".replace('и', 'е');
"Превіт"
"Привіт".replace('и', 'і');
"Прівіт"

Методи replaceFirst() і replaceAll()

Метод replaceAll() замінює всі входження підрядка, переданого в першому параметрі, на підрядок, переданий у другому параметрі. Метод replaceFirst() замінює перше входження підрядка, переданого в першому параметрі, на підрядок, переданий у другому параметрі. Підрядок, який потрібно замінити, визначається регулярним виразом. Регулярні вирази ми розглядатимемо в квесті Java Multithreading.

Приклади:

Код Результат
"Good news everyone!".replaceAll("e.", "EX");
"Good nEXs EXEXyonEX"
"Good news everyone!".replaceAll("o.", "-o-");
"G-o-d news every-o-e!"
"Good news everyone!".replaceFirst("e.", "EX");
"Good nEXs everyone!"
"Good news everyone!".replaceFirst("o.", "-o-");
"G-o-d news everyone!"

Методи toLowerCase() і toUpperCase()

З цими методами ви познайомилися ще тоді, коли тільки починали вивчати методи класу String.

Метод trim()

Метод trim() видаляє пробіли на початку та в кінці рядка. Пробіли всередині рядка ігноруються. Приклади:

Код Результат
"     ".trim();
""
"Привіт".trim();
"Привіт"
" Привіт\n як справи?\n   ".trim();
"Привіт\n як справи?\n"
"  Пароль\n   \n ".trim();
"Пароль\n   \n"