Меню сайта

Урок 9. Работа со строками в Java ( Часть 2 )

indexOf и lastIndexOf

В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода — indexOf и lastIndexOf. Каждый из этих методов возвращает индекс того символа, который вы хотели найти, либо индекс начала ис­комой подстроки. В любом случае, если поиск оказался неудачным ме­тоды возвращают значение -1. В очередном примере показано, как пользоваться -различными -вариантами этих методов поиска.

class indexOfDemo {

public static void main(String args[]) {

String s = «Now is the time for all good men» +

«to come to the aid of their country«+

«and pay their due taxes.»-

System.out.println(s)-

System.out.println(«indexOf(t) = » + s.indexOf(‘f’))-

System.out.println(«lastlndexOf(t) = » + s.lastlndexOf(‘f’))-

System.out.println(«indexOf(the) = » + s.indexOf(«the»))-

System.out.println(«lastlndexOf(the) = » + s.lastlndexOf(«the»))-

System.out.println(«indexOf(t, 10) = » + s.indexOf(‘f’ , 10))-

System.out.println(«lastlndexOf(t, 50) = » + s.lastlndexOf(‘f’ , 50))-

System.out.println(«indexOf(the, 10) = » + s.indexOf(«the», 10))-

System.out.println(«lastlndexOf(the, 50) = » + s.lastlndexOf(«the», 50))-

} }

Ниже приведен результат работы этой программы. -Обратите внимание на то, что индексы в строках начинаются с нуля.

С:&gt- java indexOfDemo

Now is the time for all good men to come to the aid of their country

and pay their due taxes.

indexOf(t) = 7

lastlndexOf(t) = 87

indexOf(the) = 7

lastlndexOf(the) = 77

index0f(t, 10) = 11

lastlndex0f(t, 50) = 44

index0f(the, 10) = 44

lastlndex0f(the, 50) = 44

Модификация строк при копировании

Поскольку объекты класса String нельзя изменять, всякий раз, когда вам захочется модифицировать строку, придется либо копировать ее в объект типа StringBuffer, либо использовать один из описываемых ниже методов класса String, которые создают новую копию строки, внося в нее ваши изменения.

substring

Вы можете извлечь подстроку из объекта String, используя метод —sub­string. Этот метод создает новую копию символов из того диапазона ин­дексов оригинальной строки, который вы указали при вызове. Можно указать только индекс первого символа нужной подстроки — тогда будут скопированы все символы, начиная с указанного и до конца строки. Также можно указать и начальный, и конечный индексы — при этом в новую строку будут скопированы все символы, начиная с первого ука­занного, и до (но не включая его) символа, заданного конечным индек­сом.

«Hello World».substring(6) -&gt- «World»

«Hello World».substring(3,8) -&gt- «lo Wo»

concat

Слияние, или конкатенация строк выполняется с помощью метода concat. Этот метод создает новый объект String, копируя в него содер­жимое исходной строки и добавляя в ее конец строку, указанную в параметре метода.

«Hello».concat(» World») -&gt- «Hello World»

replace

Методу replace в качестве параметров задаются два символа. Все сим­волы, совпадающие с первым, заменяются в новой копии строки на вто­рой символ.

«Hello».replace(‘l’ , ‘w’) -&gt- «Hewwo»

toLowerCase и toUpperCase

Эта пара методов преобразует все символы исходной строки в нижний и верхний регистр, соответственно.

«Hello».toLowerCase() -&gt- «hello»

«Hello».toUpperCase() -&gt- «HELLO»

trim

И, наконец, метод trim убирает из исходной строки все ведущие и замыкающие пробелы.

«Hello World -«.trirn() -&gt- «Hello World»

valueOf

Если вы имеете дело с каким-либо типом данных и хотите вывести значение этого типа в удобочитаемом виде, сначала придется преобразо­вать это значение в текстовую строку. Для этого существует метод val­ueOf. Такой статический метод определен для любого существующего в Java типа данных (все эти методы совмещены, то есть используют одно и то же имя). Благодаря этому не составляет труда преобразовать в стро­ку значение любого типа.

StringBuffer

StringBuffer — близнец класса String, предоставляющий многое из того, что обычно тр
ебуется при работе со строками. Объекты класса String представляют собой строки фиксированной длины, которые нельзя изме­нять. Объекты типа StringBuffer представляют собой последовательности символов, которые могут расширяться и модифицироваться. Java активно ис­пользует оба класса, но многие программисты предпочитают работать только с объектами типа String, используя оператор +. При этом Java вы­полняет всю необходимую работу со StringBuffer за сценой.

Конструкторы

Объект StringBuffer можно создать без параметров, при этом в нем будет зарезервировано место для размещения 16 символов без возмож­ности изменения длины строки. Вы также можете передать конструкто­ру целое число, для того чтобы явно задать требуемый размер буфера. И, наконец, вы можете передать конструктору строку, при этом она будет скопирована в объект и дополнительно к этому в нем будет заре­зервировано место еще для 16 символов. Текущую длину StringBuffer можно определить, вызвав метод —length, а для определения всего места, зарезервированного под строку в объекте StringBuffer нужно воспользоваться методом —capacity. Ниже приведен пример, поясняющий это:

class StringBufferDemo {

public static void main(String args[]) {

StringBuffer sb = new StringBuffer(«Hello»)-

System.out.println(«buffer = » + sb)-

System.out.println(«length = » + sb.length())-

System.out. println(«capacity = » + sb.capacity())-

} }

Вот вывод этой программы, из которого видно, что в объекте String-Buffer для манипуляций со строкой зарезервировано дополнительное место.

С:&#92-&gt- java StringBufferDemo

buffer = Hello

length = 5

capacity = 21

ensureCapacity

Если вы после создания объекта StringBuffer захотите зарезервировать в нем место для определенного количества символов, вы можете —для -установки размера буфера воспользоваться методом —ensureCapacity. Это бывает полезно, когда вы заранее знаете, что вам придется добавлять к буферу много небольших строк.

setLength

Если вам вдруг понадобится в явном виде установить длину строки в буфере, воспользуйтесь методом setLength. Если вы зададите значение, большее чем длина содержащейся в объекте строки, этот метод заполнит -конец новой, расширенной строки символами с кодом нуль. В приводимой чуть дальше программе setCharDemo метод sstLength используется для укорачивания буфера.

charAt и setCharAt

Одиночный символ может быть извлечен из объекта StringBuffer с помощью метода —charAt. Другой метод —setCharAt -позволяет записать в заданную позицию строки нужный символ. Использование обоих этих методов проиллюстрировано в примере:

class setCharAtDemo {

public static void main(String args[]) {

StringBuffer sb = new StringBuffer(«Hello»)-

System.out.println(«buffer before = » + sb)-

System.out.println(«charAt(1) before = » + sb.charAt(1))-

sb.setCharAt(1, ‘i’)-

sb.setLength(2)-

System.out.println(«buffer after = » + sb)-

System.out.println(«charAt(1) after = » + sb.charAt(1))-

}}

Вот вывод, полученный при запуске этой программы.

C:&#92-&gt- java setCharAtDemo

buffer before = Hello

charAt(1) before = e

buffer after = Hi

charAt(1) after = i

append

Метод —append -класса StringBuffer обычно вызывается неявно при ис­пользовании оператора + в выражениях со строками. Для каждого параметра вызывается метод String.valueOf и его результат до­бавляется к текущему объекту StringBuffer. К тому же при каждом вы­зове метод append возвращает ссылку на объект StringBuffer, с которым он был вызван. Это позволяет выстраивать в цепочку последовательные вызовы метода, как это показано в очередном примере.

class appendDemo {

public static void main(String args[]) {

String s-

int a = 42-

StringBuffer sb = new StringBuffer(40)-

s = sb.append(«a = «).append(a).append(«!»).toString()-

System.out.println(s)-

} }

Вот вывод этого примера:

С:&#92-&gt- Java appendDemo

а = 42!

insert

Метод —insert -идентичен методу append в том смысле, что для каждого возможного типа данных существует своя совмещенная версия этого ме­тода. Правда, в отличие от append, он не добавляет символы, возвра­щаемые методом String.valueOf, в конец объекта StringBuffer, а встав­ляет их в определенное место в буфере, задаваемое первым его параметром. В очередном нашем примере строка «there» вставляется между «hello» и «world!».

class insertDemo {

public static void -main(String args[]) {

StringBuffer sb = new StringBuffer(«hello world !»)-

sb.insert(6,»there «)-

System.out.println(sb)-

} }

При запуске эта программа выводит следующую -строку:

С:&#92-&gt- java insertDemo

hello there world!

Без строк не обойдешься

Почти любой аспект программирования в Java на каком либо этапе подразумевает использование классов String и StringBuffer. Они понадо­бятся и при отладке, и при работе с текстом, и при указании имен фай­лов и адресов URL в качестве параметров методам. Каждый второй байт большинства строк в Java — нулевой (Unicode -пока используется редко). То, что строки в Java требуют вдвое больше памяти, чем обыч­ные ASCII, не очень пугает, пока вам для эффективной работы с текстом в редакторах и других подобных приложениях не придется напрямую работать с огромным массивом типа char. —

Категория: Обучение Java | Дата: 15.04.13

Меню раздела
Блок