Поиск символа в строке

Работа со строками

Работа со строками осуществляется двумя классами: string и stringBuffer.

В объектах класса string хранятся строки-константы неизменной длины и содержания. Длину строк, хранящихся в объектах класса stringBuffer, можно менять, вставляя и добавляя строки и символы, удаляя подстроки или сцепляя несколько строк в одну строку. Во многих случаях, когда надо изменить длину строки типа string, компилятор Java неявно преобразует ее к типу stringBuffer, меняет длину, потом преобразует обратно в тип string. Например, следующее действие

Cимволы в строках хранятся в кодировке Unicode, в которой каждый символ занимает два байта. Тип каждого символа char.

Класс String

Cоздание строк

Самый простой способ создать строку — это организовать ссылку типа string на строку-константу:

String si = "Это строка.";

Самый правильный способ создать объект с точки зрения ООП — это вызвать его конструктор в операции new. Класс string предоставляет вам девять конструкторов:

•   string() — создается объект с пустой строкой;

•   string (String str) — из одного объекта создается другой;

•   string (StringBuffer str) — копия объекта класса BufferString;

•   string(byte[] byteArray) — из массива байтов byteArray;

•   String (char [] charArray) — из массива charArray символов Unicode;

•   String (byte [] byteArray, int offset, int count) — объект создается из части массива байтов byteArray, начинающейся с индекса offset и содержащей count байтов;

•   String (char [] charArray, int offset, int count) — то же, но массив состоит из символов Unicode;

•   String(byte[] byteArray, String encoding) — символы, записанные в массиве байтов, задаются в Unicode-строке, с учетом кодировки encoding;

•   String(byte[] byteArray, int offset, int count, String encoding) — то же самое, но только для части массива.

При неправильном заданий индексов offset, count или кодировки encoding возникает исключительная ситуация.

Конструкторы, использующие массив байтов byteArray, предназначены для создания Unicode-строки из массива байтовых ASCII-кодировок символов. Такая ситуация возникает при чтении ASCII-файлов, извлечении информации из базы данных или при передаче информации по сети.

Еще один способ создать строку — это использовать два статических метода

copyValueOf(chart[] charArray)

и

copyValueOf(char[] charArray, int offset, int length).

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

chart[] с = ('С', 'и', 'м', 'в', 'о ', 'л', 'ь', 'н', 'ы', 'й'};

String s1 = String.copyValueOf(с);

String s2 = String.copyValueOf(с, 3, 7);

получим в объекте s1 строку " Символьный ", а в объекте s2 — строку " вольный ".

 

Сцепление строк

Со строками можно производить операцию сцепления строк (concatenation), обозначаемую знаком плюс +. Эта операция создает новую строку, просто составленную из состыкованных первой и второй строк. Ее можно применять и к константам, и к переменным. Например:

String attention = "Внимание: ";

String s = attention + "неизвестный символ";

Вторая операция — присваивание += — применяется к переменным в левой части:

attention += s;

Длина строки

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

String s = "Write once, run anywhere.";

int len = s.length{);

или

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

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

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

char ch = s.charAt(3);

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

toCharArray(),

возвращающим массив символов.

Если же надо включить в массив символов dst, начиная с индекса ind массива подстроку от индекса begin включительно до индекса end исключительно, то используйте метод

 getChars(int begin, int end, char[] dst, int ind) типа void.

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

Выбрка подстроки

Метод 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.

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

Логический метод

equalsIgnoreCase(object obj)

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

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

1. Сравниваются символы данной строки this и строки str с одинаковым индексом, пока не встретятся различные символы с индексом, допустим k, или пока одна из строк не закончится.

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.

Поиск символа в строке

Первое появление символа ch в данной строке this можно отследить методом

indexOf(int ch)

, возвращающим индекс этого символа в строке или -1, если символа ch в строке this нет.

Второе и следующие появления символа ch в данной строке this можно отследить методом

indexOf(int ch, int ind).

Последнее появление символа ch в данной строке this отслеживает метод

lastIndexof (int ch).

Он просматривает строку в обратном порядке. Если символ ch не найден, возвращается.-1.

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

Поиск подстроки

Первое вхождение подстроки sub в данную строку this отыскивает метод

indexof (String sub).

Он возвращает индекс первого символа первого вхождения подстроки sub в строку или -1, если подстрока subне входит в строку this.

Если необходимо начать поиск не с начала строки, а с какого-то индекса ind, используйте метод

indexOf (String sub, int ind).

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

Последнее вхождение подстроки sub в данную строку this можно отыскать методом

lastindexof (string sub),

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

Для того чтобы проверить, не начинается ли данная строка this с подстроки sub, используйте логический метод

startsWith(string sub),

возвращающий true, если данная строка this начинается с подстроки sub, или совпадает с ней, или подстрока sub пуста.

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

Особенность методо состоит в том, что он возвращает true, если подстрока sub совпадает со всей строкой или подстрока sub пуста.

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

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

sub == null.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: