Манипуляции строками

 

В классе string есть множество методов для работы со строками. Посмотрим, что они позволяют делать.

 

Как узнать длину строки

 

Для того чтобы узнать длину строки, т. е. количество символов в ней, надо обратиться к методу length() :

String s = «Write once, run anywhere.»; 

int len = s.length{);

или еще проще

int len = «Write once, run anywhere.».length();

поскольку строка-константа — полноценный объект класса string . Заметьте, что строка — это не массив, у нее нет поля length .

Внимательный читатель готов со мной не согласиться. Ну, что же, действительно, символы хранятся в массиве, но он закрыт, как и все поля класса string .

 

Как выбрать символ из строки

 

Выбрать символ с индексом ind (индекс первого символа равен нулю) можно методом charAt(int ind) Если индекс ind отрицателен или не меньше чем длина строки, возникает исключительная ситуация. Например, после определения

char ch = s.charAt(3);

переменная ch будет иметь значение ‘t’

Все символы строки в виде массива символов можно получить методом

toCharArray() , возвращающим массив символов.

Если же надо включить в массив символов dst , начиная с индекса ind массива подстроку от индекса begin включительно до индекса end исключительно, то используйте метод getChars(int begin, int end, char[] dst, int ind) типа void .

В массив будет записано end — begin символов, которые займут элементы массива, начиная с индекса ind до индекса in d + (end — begin) — 1 .

Этот метод создает исключительную ситуацию в следующих случаях: 

  • ссылка dst = null ; 
  • индекс begin отрицателен; 
  • индекс begin больше индекса end ;
  • индекс end больше длины строки; 
  • индекс ind отрицателен;
  • ind + (end — begin) > dst.length.

Например, после выполнения

char[] ch = (‘К’, ‘о’, ‘р’, ‘о’, ‘л’, ‘ь’, ‘ ‘, ‘л’, ‘е’, ‘т’, ‘а’};

«Пароль легко найти».getChars(2, 8, ch, 2);

результат будет таков:

ch = (‘К’, ‘о’, ‘р’, ‘о’, ‘л’, ‘ь ‘, ‘ ‘, ‘л’, ‘е’, ‘т’, ‘а’};

Если надо получить массив байтов, содержащий все символы строки в байтовой кодировке ASCII, то используйте метод getBytes() .

Этот метод при переводе символов из Unicode в ASCII использует локальную кодовую таблицу.

Если же надо получить массив байтов не в локальной кодировке, а в какой-то другой, используйте метод getBytes(String encoding) .

Так сделано в листинге 5.1 при создании объекта msg. Строка «\’Россия в\»» перекодировалась в массив СР866-байтов для правильного вывода кириллицы в консольное окно Command Prompt операционной системы Windows 2000.

 

Как выбрать подстроку

 

Метод substring(int begin, int end) выделяет подстроку от символа с индексом begin включительно до символа с индексом end исключительно. Длина подстроки будет равна end — begin .

Метод substring (int begin) выделяет подстроку от индекса begin включительно до конца строки.

Если индексы отрицательны, индекс end больше длины строки или begin больше чем end , то возникает исключительная ситуация.

Например, после выполнения

String s = «Write onсe, run anywhere.»; 

String sub1 = s.substring(6, 10); 

String sub2 = s.substring(16);

получим в строке sub1 значение » once «, а в sub2 — значение » anywhere «.

 

Как сравнить строки

 

Операция сравнения == сопоставляет только ссылки на строки. Она выясняет, указывают ли ссылки на одну и ту же строку. Например, для строк

String s1 = «Какая-то строка»; 

String s2 = «Другая-строка»;

сравнение s1 == s2 дает в результате false .

Значение true получится, только если обе ссылки указывают на одну и ту же строку, например, после присваивания si = s2 .

Интересно, что если мы определим s2 так:

String s2 == «Какая-то строка»;

то сравнение s1 == s2 даст в результате true , потому что компилятор создаст только один экземпляр константы «Какая-то строка» и направит на него все ссылки.

Вы, разумеется, хотите сравнивать не ссылки, а содержимое строк. Для этого есть несколько методов.

Логический метод equals (object obj) , переопределенный из класса object , возвращает true , если аргумент obj не равен null , является объектом класса string , и строка, содержащаяся в нем, полностью идентична данной строке вплоть до совпадения регистра букв. В остальных случаях возвращается значение false .

Логический метод equalsIgnoreCase(object obj) работает так же, но одинаковые буквы, записанные в разных регистрах, считаются совпадающими.

Например, s2.equals(«другая строка») даст в результате false , а s2.equalsIgnoreCase(«другая строка») возвратит true .

Метод compareTo(string str) возвращает целое число типа int , вычисленное по следующим правилам:

  1. Сравниваются символы данной строки this и строки str с одинаковым индексом, пока не встретятся различные символы с индексом, допустим , или пока одна из строк не закончится.
  2. В первом случае возвращается значение this.charAt(k) — str.charAt(k), т. е. разность кодировок Unicode первых несовпадающих символов.
  3. Во втором случае возвращается значение this.length() — str.length() , т. е. разность длин строк.
  4. Если строки совпадают, возвращается 0.

Если значение str равно null , возникает исключительная ситуация.

Нуль возвращается в той же ситуации, в которой метод equals() возвращает true .

Метод compareToignoreCase(string str) производит сравнение без учета регистра букв, точнее говоря, выполняется метод

this.toUpperCase().toLowerCase().compareTo( 

str.toUpperCase().toLowerCase());

Еще один метод— compareTo (Object obj) создает исключительную ситуацию, если obj не является строкой. В остальном он работает как метод compareTo(String str).

Эти методы не учитывают алфавитное расположение символов в локальной кодировке.

Русские буквы расположены в Unicode по алфавиту, за исключением одной буквы. Заглавная буква Ё расположена перед всеми кириллическими буквами, ее код ‘\ u040l ‘, а строчная буква е — после всех русских букв, ее код ‘\ u0451 ‘.

Если вас такое расположение не устраивает, задайте свое размещение букв с помощью класса  RuleBasedCollator из пакета java.text .

Сравнить подстроку данной строки this с подстрокой той же длины len другой строки str можно логическим методом

regionMatches(int indl, String str, int ind2, int len)

Здесь ind1 — индекс начала подстроки данной строки this, ind2 — индекс начала подстроки другой строки str . Результат false получается в следующих случаях:

  • хотя бы один из индексов ind1 или ind2 отрицателен;
  • хотя бы одно из ind1 + len или ind2 + len больше длины соответствующей строки;
  • хотя бы одна пара символов не совпадает.

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

regionMatches(boolean flag, int indl, String str, int ind2, int len)

Если первый параметр flag равен true , то регистр букв при сравнении подстрок не учитывается, если false — учитывается.

 

Как найти символ в строке

 

Поиск всегда ведется с учетом регистра букв.

Первое появление символа ch в данной строке this можно отследить методом indexOf(int ch) , возвращающим индекс этого символа в строке или -1 , если символа ch в строке this нет.

Например, «Молоко», indexOf(‘о’) выдаст в результате 1 .

Конечно, этот метод выполняет в цикле последовательные сравнения this.charAt(k++> == ch , пока не получит значение true .

Второе и следующие появления символа ch в данной строке this можно отследить методом indexOf(int ch, int ind) .

Этот метод начинает поиск символа ch с индекса ind . Если ind < о, то поиск идет с начала строки, если ind больше длины строки, то символ не ищется, т. е. возвращается -1.

Например, «молоко».indexof(‘о’, indexof (‘о’) + 1)   даст в результате 3.

Последнее появление символа ch в данной строке this отслеживает метод lastIndexof (int ch)Он просматривает строку в обратном порядке. Если символ ch не найден, возвращается.-1. 

Например, «Молоко».lastindexof(‘о’) даст в результате 5. 

Предпоследнее и предыдущие появления символа ch в данной строке this можно отследить методом lastIndexof (int ch, int ind) , который просматривает строку в обратном порядке, начиная с индекса ind .

Если ind больше длины строки, то поиск идёт от конца строки, если ind < о, то возвращается -1.

 

Как найти подстроку

 

Поиск всегда ведется с учетом регистра букв.

Первое вхождение подстроки sub в данную строку this отыскивает метод indexof (String sub). Он возвращает индекс первого символа первого вхождения подстроки sub в строку или -1, если подстрока sub не входит в строку this . Например, » Раскраска «.indexof («рас») даст в результате 4.

Если вы хотите начать поиск не с начала строки, ас какого-то индекса ind , используйте метод indexOf (String sub, int ind). если  i nd < 0 , то поиск идет с начала строки, если ind больше .длины строки, то символ не ищется, т. е. возвращается -1.

Последнее вхождение подстроки sub в данную строку this можно отыскать методом lastindexof ( string sub ), возвращающим индекс первого символа последнего вхождения подстроки sub в строку this или (-1), если подстрока sub не входит в строку this .

Последнее вхождение подстроки sub не во всю строку this , а только в ее начало до индекса ind можно отыскать методом l astIndexof(String stf, int ind ). Если ind больше длины строки, то .поиск идет от конца строки, если ind < о , то возвращается -1.

Для того чтобы проверить, не начинается ли данная строка this с подстроки sub , используйте логический метод startsWith(string sub) , возвращающий true , если данная строка this начинается с подстроки sub , или совпадает с ней, или подстрока sub пуста. 

Можно проверить и появление подстроки sub в данной строке this , начиная с некоторого индекса ind логическим методом s tartsWith(String sub),int ind). Если индекс ind отрицателен или больше длины строки, возвращается   false . 

Для того чтобы проверить, не заканчивается ли данная строка this подстрокой sub , используйте логический метод endsWitht(String sub) . Учтите, что он возвращает true , если подстрока sub совпадает со всей строкой или подстрока sub пуста.

Например, if (fileName.endsWith(«. Java»)) отследит имена файлов с исходными текстами Java.

Перечисленные выше методы создают исключительную ситуацию, если

sub == null.

Если вы хотите осуществить поиск, не учитывающий регистр букв, измените предварительно регистр всех символов строки.

 

Как изменить регистр букв

Метод toLowerCase () возвращает новую строку, в которой все буквы переведены в нижний регистр, т. е. сделаны строчными.

Метод toUpperCase () возвращает новую строку, в которой все буквы переведены в верхний регистр, т. е. сделаны прописными.

При этом используется локальная кодовая таблица по умолчанию. Если нужна другая локаль, то применяются методы toLowerCase(Locale l oc ) и toUpperCase(Locale loc).

 

Как заменить отдельный символ

 

Метод replace (int old, int new) возвращает новую строку, в которой все вхождения символа old заменены символом new . Если символа old в строке нет, то возвращается ссылка на исходную строку.

Например, после выполнения » Рука в руку сует хлеб» , replace (‘у’, ‘е’) получим строку » Река в реке сеет хлеб».

 

Как убрать пробелы в начале и конце строки

 

Метод trim о возвращает новую строку, в которой удалены начальные и конечные символы с кодами, не превышающими ‘\u0020 ‘.

 

Как преобразовать данные другого типа в строку

 

В языке Java принято соглашение — каждый класс отвечает за преобразование других типов в тип этого класса и должен содержать нужные для этого методы.

Класс string содержит восемь статических методов valueof (type elem) преобразования В строку примитивных типов boolean, char, int, long, float, double , массива char[] , и просто объекта типа object .

Девятый метод valueof(char[] ch, int offset, int len) преобразует в строку подмассив массива ch , начинающийся с индекса offset и имеющий len элементов.

Кроме того, в каждом классе есть метод tostring () , переопределенный или просто унаследованный от класса Object . Он преобразует объекты класса в строку. Фактически, метод valueOf о вызывает метод tostring() соответствующего класса. Поэтому результат преобразования зависит от того, как реализован метод tostring ().

Еще один простой способ — сцепить значение elem какого-либо типа с пустой строкой: «» + elem. При этом неявно вызывается метод  elem. toString ().