Учим Java. Работа со строками
Учим Java. Работа со строками Продолжая разговор о средствах Java для обработки символьной информации, нельзя обделить вниманием такие классы, как StringBuffer и StringTokenizer. Первый представляет собой строку, которую можно изменять, в отличие от String. Второй предоставляет возможность разбора строк. В этой статье мы поговорим об основных методах этих классов, а также о том, как и где их можно применять.
Итак, класс StringBuffer. Рассмотрим два его конструктора:
StringBuffer() — не принимает никаких параметров и просто создает объект класса StringBuffer.
StringBuffer(String s) — принимает ссылку на объект класса String и создает экземпляр StringBuffer на основе этой строки.
Создадим какую-нибудь ссылку на объект класса StringBuffer:
String s = "this is text";
StringBuffer sb = new StringBuffer(s);
Далее по очередности рассмотрим методы класса StringBuffer. Начнем с методов для изменения содержимого буфера, т.е. с основной особенности этого класса.
setCharAt(int i, char ch) — изменит символ с индексом i на символ ch.
setLength(int length) — этот метод укорачивает буфер StringBuffer до заданной длины. Здесь значение переменной length должно быть меньше длины буфера.
append(...) — добавляет в конец буфера строку. Т.е. преобразует объект в строку и добавляет полученное значение в конец заданного буфера. Вот список типов, которые можно использовать: Object, String, char[], boolean, char, int, long, float, double.
insert(...) — в отличие от append(), может добавлять строку в любое место заданного буфера, иными словами вставлять подстроку в буфер. Список используемых типов смотри выше.
reverse() — Реверсирует заданную строку. Т.е. перестраивает порядок следования символов в строке на обратный. Очень полезный метод.
delete(int begin, int end) — удаляет последовательность символов из буфера, начиная с позиции begin, заканчивая позицией end.
deleteCharAt(int i) — удаляет символ из буфера в позиции i.
StringBuffer replace(int start, int end, String s) — заменяет в строке символы от start до end на строку s. Размер буфера изменяется в соответствии с размером сроки s. Если ее длина больше количества символов в интервале start — end, то тогда буфер увеличивается в длине, если меньше — укорачивается. Результат-буфер возвращается методом.
StringBuffer insert(int i, char[] chars, int start, int count) — иная версия обычного insert(...). Этот вариант insert() вставляет в буфер count символов массива символов chars, начиная с позиции start в массиве, после элемента с номером i в буфере. Результат будет возвращен методом.
Теперь немного о способах преобразования экземпляров класса StringBuffer. Для того чтобы из StringBuffer получить строку, можно воспользоваться уже известным вам методом toString() или же передать экземпляр буфера в качестве параметра конструктору String. Если возникла необходимость преобразовать StringBuffer в массив символов (char[]), то можно обойтись методом getChars():
getChars(int sb, int se, char[] ds, int dsb) — символы из буфера в диапазоне sb и se копируются в массив ds, начиная с позиции dsb в массиве. Последний символ с номером se не учитывается и скопирован не будет.
Очень часто может понадобиться ограничить размер буфера. По умолчанию вы можете вставлять данные в буфер, пока не исчерпаете все доступные ресурсы. А это не всегда допустимо, особенно когда StringBuffer заполняется из ненадежного источника: поток, файл и т.д. Чтобы установить максимальный размер буфера, и введен специальный конструктор:
StringBuffer(int limit) — limit — вместимость буфера.
Напоследок посмотрим на два метода для работы с ограничением на размер буфера:
int capacity() — возвращает текущее значение емкости буфера. Емкость — это и есть максимальный размер буфера.
void ensureCapacity(int i) — изменяет значение вместимости буфера на i.
На этом обзор класса StringBuffer можно завершить. Подводя итог, еще раз скажу, что StringBuffer предназначен для промежуточных операций над строками, например для изменения их содержимого без необходимости создания промежуточных экземпляров этого класса.
Также класс StringBuffer может быть без особых трудностей преобразован как в String, так и в массив символов.
Следующий класс из сегодняшнего обзора — StringTokenizer. Он позволяет разбивать на части строки по заданным delimiters (разделители). Он сильно напоминает класс StreamTokenizer. Они оба выполняют фактически одни и те же функции, только StreamTokenizer работает и разбирает потоки, а StringTokenizer — строки.
Для начала конструктор:
StringTokenizer(String s, String delimiters) — первый параметр s задает строку, которую предстоит анализировать, а второй (delimiters) — список разделителей.
StringTokenizer(String s, String delimiters, boolean returnTokens) — аналогично предыдущему, returnTokens определяет, возвращать ли разделители вместе с лексемами? Если true — то будут возвращены все присутствующие в строке разделители вместе с тем, что стоит между ними (лексемы).
StringTokenizer(String s) — то же, когда returnTokens = false, а delimiters = " \t\n\f\r".
Методы:
boolean hasMoreTokens() — возвращает true, если может быть возвращена еще хотя бы одна лексема.
String nextToken() — возвращает очередную лексему. Повторно вернуть ее не удастся без повторного создания StringTokenizer, поэтому если предстоит использовать это значение многократно, то его следует сохранить в какой-нибудь переменной. Если в очереди нет больше лексем, то выбрасывается исключение NoSuckElementException.
String nextToken(String delimiters) — то же, что и предыдущее, только с установкой нового набора разделителей. Если в очереди нет больше лексем, то выбрасывается исключение NoSuckElementException.
int countTokens() — возвращает количество лексем, которые находятся в очереди на возвращение методом nextToken().
Вот почти весь StringTokenizer. Ничего сложного здесь нет. Для примера давайте разберем введенную с клавиатуры строку, состоящую из пары "параметр = значение" и выведем на экран "параметр -> значение".
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine().trim();
StringTokenizer st = new StringTokenizer(s, "=");
if (st.countTokens() > = 2) {
System.out.println(st.nextToken().trim() + " -> " + st.nextToken().trim());
}
Вот и весь разбор.
Наш обзор методов работы со строками подошел к своему завершению. Надеюсь, он оказался кому-то полезным. Работа со строками в Java представлена очень гибкими средствами-классами, возможности которых должен знать каждый, кто программирует на Java. Жду ваших писем.
Алексей Литвинюк
Итак, класс StringBuffer. Рассмотрим два его конструктора:
StringBuffer() — не принимает никаких параметров и просто создает объект класса StringBuffer.
StringBuffer(String s) — принимает ссылку на объект класса String и создает экземпляр StringBuffer на основе этой строки.
Создадим какую-нибудь ссылку на объект класса StringBuffer:
String s = "this is text";
StringBuffer sb = new StringBuffer(s);
Далее по очередности рассмотрим методы класса StringBuffer. Начнем с методов для изменения содержимого буфера, т.е. с основной особенности этого класса.
setCharAt(int i, char ch) — изменит символ с индексом i на символ ch.
setLength(int length) — этот метод укорачивает буфер StringBuffer до заданной длины. Здесь значение переменной length должно быть меньше длины буфера.
append(...) — добавляет в конец буфера строку. Т.е. преобразует объект в строку и добавляет полученное значение в конец заданного буфера. Вот список типов, которые можно использовать: Object, String, char[], boolean, char, int, long, float, double.
insert(...) — в отличие от append(), может добавлять строку в любое место заданного буфера, иными словами вставлять подстроку в буфер. Список используемых типов смотри выше.
reverse() — Реверсирует заданную строку. Т.е. перестраивает порядок следования символов в строке на обратный. Очень полезный метод.
delete(int begin, int end) — удаляет последовательность символов из буфера, начиная с позиции begin, заканчивая позицией end.
deleteCharAt(int i) — удаляет символ из буфера в позиции i.
StringBuffer replace(int start, int end, String s) — заменяет в строке символы от start до end на строку s. Размер буфера изменяется в соответствии с размером сроки s. Если ее длина больше количества символов в интервале start — end, то тогда буфер увеличивается в длине, если меньше — укорачивается. Результат-буфер возвращается методом.
StringBuffer insert(int i, char[] chars, int start, int count) — иная версия обычного insert(...). Этот вариант insert() вставляет в буфер count символов массива символов chars, начиная с позиции start в массиве, после элемента с номером i в буфере. Результат будет возвращен методом.
Теперь немного о способах преобразования экземпляров класса StringBuffer. Для того чтобы из StringBuffer получить строку, можно воспользоваться уже известным вам методом toString() или же передать экземпляр буфера в качестве параметра конструктору String. Если возникла необходимость преобразовать StringBuffer в массив символов (char[]), то можно обойтись методом getChars():
getChars(int sb, int se, char[] ds, int dsb) — символы из буфера в диапазоне sb и se копируются в массив ds, начиная с позиции dsb в массиве. Последний символ с номером se не учитывается и скопирован не будет.
Очень часто может понадобиться ограничить размер буфера. По умолчанию вы можете вставлять данные в буфер, пока не исчерпаете все доступные ресурсы. А это не всегда допустимо, особенно когда StringBuffer заполняется из ненадежного источника: поток, файл и т.д. Чтобы установить максимальный размер буфера, и введен специальный конструктор:
StringBuffer(int limit) — limit — вместимость буфера.
Напоследок посмотрим на два метода для работы с ограничением на размер буфера:
int capacity() — возвращает текущее значение емкости буфера. Емкость — это и есть максимальный размер буфера.
void ensureCapacity(int i) — изменяет значение вместимости буфера на i.
На этом обзор класса StringBuffer можно завершить. Подводя итог, еще раз скажу, что StringBuffer предназначен для промежуточных операций над строками, например для изменения их содержимого без необходимости создания промежуточных экземпляров этого класса.
Также класс StringBuffer может быть без особых трудностей преобразован как в String, так и в массив символов.
Следующий класс из сегодняшнего обзора — StringTokenizer. Он позволяет разбивать на части строки по заданным delimiters (разделители). Он сильно напоминает класс StreamTokenizer. Они оба выполняют фактически одни и те же функции, только StreamTokenizer работает и разбирает потоки, а StringTokenizer — строки.
Для начала конструктор:
StringTokenizer(String s, String delimiters) — первый параметр s задает строку, которую предстоит анализировать, а второй (delimiters) — список разделителей.
StringTokenizer(String s, String delimiters, boolean returnTokens) — аналогично предыдущему, returnTokens определяет, возвращать ли разделители вместе с лексемами? Если true — то будут возвращены все присутствующие в строке разделители вместе с тем, что стоит между ними (лексемы).
StringTokenizer(String s) — то же, когда returnTokens = false, а delimiters = " \t\n\f\r".
Методы:
boolean hasMoreTokens() — возвращает true, если может быть возвращена еще хотя бы одна лексема.
String nextToken() — возвращает очередную лексему. Повторно вернуть ее не удастся без повторного создания StringTokenizer, поэтому если предстоит использовать это значение многократно, то его следует сохранить в какой-нибудь переменной. Если в очереди нет больше лексем, то выбрасывается исключение NoSuckElementException.
String nextToken(String delimiters) — то же, что и предыдущее, только с установкой нового набора разделителей. Если в очереди нет больше лексем, то выбрасывается исключение NoSuckElementException.
int countTokens() — возвращает количество лексем, которые находятся в очереди на возвращение методом nextToken().
Вот почти весь StringTokenizer. Ничего сложного здесь нет. Для примера давайте разберем введенную с клавиатуры строку, состоящую из пары "параметр = значение" и выведем на экран "параметр -> значение".
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine().trim();
StringTokenizer st = new StringTokenizer(s, "=");
if (st.countTokens() > = 2) {
System.out.println(st.nextToken().trim() + " -> " + st.nextToken().trim());
}
Вот и весь разбор.
Наш обзор методов работы со строками подошел к своему завершению. Надеюсь, он оказался кому-то полезным. Работа со строками в Java представлена очень гибкими средствами-классами, возможности которых должен знать каждый, кто программирует на Java. Жду ваших писем.
Алексей Литвинюк
Компьютерная газета. Статья была опубликована в номере 23 за 2002 год в рубрике программирование :: java