Назад Зміст Вперед

5.2. АРІ класу String. Використання методів класу String для обробки рядкових масивів

АРІ класу String

Клас String дуже часто використовується програмістами, тому його слід вивчити дуже добре.
Слід пам'ятати, що об'єкти класу String є незмінними. Тому, коли вам здається, що ви міняєте рядок, то насправді ви створюєте новий рядок. У Java є спеціальні класи StringBuffer і StringBuilder, який допускають зміни в рядку.
Класи String, StringBuffer, StringBuilder визначені в пакеті java.lang і доступні автоматично без оголошення імпорту. Всі три класи реалізують інтерфейс CharSequence.
Створити рядок дуже просто. Наприклад, можна так:
String aboutCat = "Кіт - це звучить гордо, а якщо наступити на хвіст, то голосно";
Можна створити масив рядків:
String[] cats = {"Васька", "Барсик", "Мурзик"};
Можна створити порожній об'єкт класу String:
String str = new String();
Можна створити рядок через масив символів:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
Є ще конструктор, що дозволяє задати діапазон символьного масиву. Вам потрібно вказати початок діапазону і кількість символів для використання:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3); 
Можна створити об'єкт класу String з об'єкта класів StringBuffer і StringBuilder за допомогою наступних конструкторів:
String(StringBuffer об'єкт_StrBuf)
String(StringBuilder об'єкт_StrBuild)

Оператори + і += для String

На мові Java знак плюс (+) означає конкатенацію рядків (concatenation), іншими словами - об'єднання рядків.
String cat = "Кіт";
String name = "Васька";
//складовими є два рядки і пробіл між ними, щоб слова не склеювалися
String fullname = cat + "" + name; // вийде Кіт Васька
Якщо один з операндів у виразі містить рядок, то інші операнди також повинні бути рядками. Тому Java сама може призвести змінні до рядка, навіть якщо вони не є рядками.
int digit = 4;
String paws = " лапи";
String aboutcat = digit + paws; //хоча ми складаємо число і рядок, але все одно отримаємо рядок
За лаштунками Java за нас перетворило число 4 в рядок "4".


String API

Використання методів класу String для обробки рядкових масивів

Ви можете отримати символ, що знаходиться на певній позиції в рядку, викликавши метод charAt (). Індекс першого символу в рядку - 0, останнього - length () - 1. Наступний код повертає 9 символ рядка.
1
2
String anotherPalindrome = "Niagara. O roar again!";
char aChar = anotherPalindrome.charAt(9);
Нумерація символів починається з 0, тому 9 символ в рядку - «О».

Нумерація символів в рядку

Якщо вам необхідно отримати не один символ, а частину рядка, можна використовувати метод substring. Метод substring має два варіанти:
МетодОпис
String substring(int beginIndex, int endIndex)Повертає підрядок даного рядка, починаючи з символу з індексом beginIndex, закінчуючи endIndex - 1.
String substring(int beginIndex)Повертає підрядок даного рядка, починаючи з символу під номером beginIndex і до кінця рядка.
Наступний код поверне підрядок рядка, починаючи з 11 символу, але не включаючи 15, вийде слово «roar»
1
2
String anotherPalindrome = "Niagara. O roar again!";
String roar = anotherPalindrome.substring(11, 15);

Інші методи для управління рядками

У таблиці наведено деякі методи для роботи з рядками і їх опис.
МетодОпис
String[] split(String regex)
String[] split(String regex, int limit)
Шукає збіги в рядку згідно заданому регулярному виразу і розбиває рядок на масив. Необов'язковий аргумент limit задає максимальний розмір поверненого масиву.
CharSequence subSequence(int beginIndex, int endIndex)Повертає послідовність символів, починаючи з beginIndex, закінчуючи endIndex — 1.
String trim()Повертає рядок, в якому вилучені зайві пробіли на початку рядка і в кінці.
String toLowerCase()
String toUpperCase()
Повертає копію рядка, символи якої переведені в нижній або верхній регістр. Якщо перетворень не вимагається повертається початковий рядок.

Пошук символів і підрядків

Розглянемо ще кілька методів для пошуку символів і підрядків.

Клас String містить методи, які повертають позицію символу або підрядка в рядку: indexOf () і lastIndexOf (). Методи indexOf() здійснюють пошук з початку рядка, lastIndexOf () - з кінця. Якщо дані методи не знайшли збігів, вони повертають -1.

Також клас String містить метод contains, який повертає true, якщо задана послідовність символів міститься в рядку. Використовуйте цей метод, якщо необхідно дізнатися про існування підрядка в рядку, а її позиція не важлива.

У наступній таблиці описуються методи indexOf () і lastIndexOf ().
МетодОпис
int indexOf(int ch)
int lastIndexOf(int ch)
Повертає індекс першого(останнього) входження символу в рядку.
int indexOf(int ch, int fromIndex)
int lastIndexOf(int ch, int fromIndex)
Повертає індекс першого (останнього) входження символу в рядку, починаючи пошук із зазначеного індексу.
int indexOf(String str)
int lastIndexOf(String str)
Повертає індекс першого (останнього) входження підрядка в рядку.
int indexOf(String str, int fromIndex)
int lastIndexOf(String str, int fromIndex)
Повертає індекс першого (останнього) входження підрядка в рядку, починаючи пошук із зазначеного індексу.
boolean contains(CharSequence s)Повертає true, якщо задана послідовність символів міститься в рядку.
CharSequence це інтерфейс, який реалізує клас Stringтому можна передавати рядки в метод contains ().

Зміна рядків. Заміна символів і підрядків

Клас String має кілька методів для вставки символів і підрядків у рядок. У таблиці описані методи для заміни знайдених символів і підрядків.
МетодОпис
String replace(char oldChar, char newChar)Повертає новий рядок, в якій всі oldChar замінені на newChar.
String replace(CharSequence target, CharSequence replacement)Замінює всі входження підрядка target на рядок replacement.
String replaceAll(String regex, String replacement)Замінює всі підрядка, які описує заданий регулярний вираз на replacement
String replaceFirst(String regex, String replacement)Замінює тільки перший відповідний рядок.

Приклад

Наступний клас Filename показує приклад використання методів lastIndexOf () і substring () 
для використання різних частин рядка з ім'ям файлу.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Filename {
    private String fullPath;
    private char pathSeparator, extensionSeparator;
    public Filename(String str, char sep, char ext) {
        fullPath = str;
        pathSeparator = sep;
        extensionSeparator = ext;
    }
    public String extension() {
        int dot = fullPath.lastIndexOf(extensionSeparator);
        return fullPath.substring(dot + 1);
    }
    //отримання імені файлу без розширення
    public String filename() {
        int dot = fullPath.lastIndexOf(extensionSeparator);
        int sep = fullPath.lastIndexOf(pathSeparator);
        return fullPath.substring(sep + 1, dot);
    }
    public String path() {
        int sep = fullPath.lastIndexOf(pathSeparator);
        return fullPath.substring(0, sep);
    }
Тепер розглянемо програму, яка використовує клас Filename:
1
2
3
4
5
6
7
8
9
public class FilenameDemo {
    public static void main(String[] args) {
        final String FPATH = "/home/user/index.html";
        Filename myHomePage = new Filename(FPATH, '/', '.');
        System.out.println("Extension = " + myHomePage.extension());
        System.out.println("Filename = " + myHomePage.filename());
        System.out.println("Path = " + myHomePage.path());
    }
}
Програма виведе:
1
2
3
Extension = html
Filename = index
Path = /home/user
Метод extension використовує метод lastIndexOf для визначення останнього входження ".". Метод substring використовує це значення для знаходження розширення файлу.

.