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

Класс String очень часто используется программистами, поэтому его следует изучить очень хорошо.

Следует помнить, что объекты класса String являются неизменяемыми (immutable). Поэтому, когда вам кажется, что вы меняете строку, то на самом деле вы создаёте новую строку.

В Java есть специальные классы StringBuffer и StringBuilder, который допускают изменения в строке.

Классы String, StringBuffer, StringBuilder определены в пакете java.lang и доступны автоматически без объявления импорта. Все три класса реализуют интерфейс CharSequence.

Создать строку очень просто. Например, можно так:

Можно создать массив строк:

Можно создать пустой объект класса String:

Можно создать строку через массив символов:

Есть ещё конструктор, позволяющий задать диапазон символьного массива. Вам нужно указать начало диапазона и количество символов для использования:

Можно создать объект класса String из объекта классов StringBuffer и StringBuilder при помощи следующих конструкторов:

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

На языке Java знак плюс (+) означает конкатенацию строк (concatenation), иными словами — объединение строк.

Если один из операндов в выражении содержит строку, то другие операнды также должны быть строками. Поэтому Java сама может привести переменные к строковому представлению, даже если они не являются строками.

За кулисами Java за нас преобразовало число 4 в строку "4".

Форматирование строк

Предположим у нас есть строковый ресурс:

Чтобы вывести эту строку программно в элементе TextView, можно использовать код:

Представьте себе, что у вас несколько котов. Можно, конечно, завести для каждого кота свою строку. Но ведь строки очень похожи, меняются только имена и возраст. Также можно менять число лап и хвостов (что вы курите?).

В таких случаях можно применить форматирование строк. Нужно определить слова, которые мы будем менять и заменить их на специальный набор символов, которые начинаются с символа процента, затем идет число, увеличивающееся на единицу, далее $s для строк или $d для чисел. Итак, изменим наш строковой ресурс так:

Внесём изменения в код:

Если вас есть кот Васька и ему шесть лет, то добавляем две переменные и форматируем строку

Здесь показан простейший пример с форматированием. Помните о нём и применяйте в нужных местах.

Строковой ресурс

Строки желательно хранить в ресурсах (о ресурсах есть отдельная статья).

Программно доступ к строковому ресурсу делается так:

Извлечь строки из строковых массивов в ресурсах

Предположим, у вас есть строковый массив, определённый в файле strings.xml под именем cats_array. Тогда получить доступ к строкам из ресурсов можно так:

Методы

public char charAt (int index)

Возвращает символ с указанным смещением в этой строке. Отсчёт идёт от 0. Не надо использовать отрицательные и несуществующие значения, будьте серьёзнее. Для извлечения нескольких символов используйте getChars().

public int codePointAt(int index)

Возвращает Unicode-символ в заданном индексе

public int codePointBefore(int index)

Возвращает Unicode-символ, который предшествует данному индексу

public int codePointCount(int start, int end)

Вычисляет количество Unicode-символов между позициями start и end

public int compareTo(String string)

Сравнивает указанную строку, используя значения символов Unicode и вычисляет, какая из строк меньше, равна или больше следующей. Может использоваться при сортировке. Регистр учитывается. Если строки совпадают, то возвращается 0, если меньше нуля, то вызывающая строка меньше строки string, если больше нуля, то вызывающая строка больше строки string. Слова с большим регистром стоят выше слова с нижним регистром.

Отсортируем массив строк через пузырьковую сортировку.

В результате мы получим:

Как видите, от перемены мест слагаемых сумма сортировки коты не меняются.

public int compareToIgnoreCase (String string)

Сравнивает указанную строку, используя значения символов Unicode, без учёта регистра.

public String concat (String string)

Объединяет строку с указанной строкой. Возвращается новая строка, которая содержит объединение двух строк. Обратите внимание, что само имя метода содержит кота!

Метод выполняет ту же функцию, что и оператор + и можно было написать Сук + кот . Но настоящий кошатник будет использовать "кошачий" метод.

public boolean contains (CharSequence cs)

Определяет, содержит ли строка последовательность символов в CharSequence

public boolean contentEquals(CharSequence cs)

Сравнивает CharSequence с этой строкой.

public boolean contentEquals(StringBuffer strbuf)

Сравнивает StringBuffer с этой строкой

public static String copyValueOf(char[] data)

Создаёт новую строку, содержащую символы из указанного массива. Изменение массива после создания строки не изменяет созданную строку.

public static String copyValueOf (char[] data, int start, int length)

Создаёт новую строку, содержащую указанные символы из массива data начиная с позиции start (нумерация начинается с нуля) длинной length.

Если указать индекс вне границ строки, то возникнет исключение StringIndexOutOfBoundsException.

public boolean endsWith(String suffix)

Проверяет, заканчивается ли строка символами suffix.

public boolean equals (Object string)

Сравнивает указанный объект и строку и возвращает true, если сравниваемые строки равны, т.е. содержит те же символы и в том же порядке с учётом регистра.

Не путать метод с оператором ==, который сравнивает две ссылки на объекты и определяет, ссылаются ли они на один и тот же экземпляр. Смотри пункт Сравнение строк: equals() или ==?

public boolean equalsIgnoreCase(String string)

Сравнивает указанную строку с исходной строкой без учёта регистра и возвращает true, если они равны. Диапазон A-Z считается равным диапазону a-z.

public static String format(Locale locale, String format, Object. args)

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

Склеиваем два слова, которые выводятся с новой строки. При этом второе слово выводится в верхнем регистре.

Конвертируем число в восьмеричную систему.

По аналогии выводим в шестнадцатеричной системе

Для верхнего регистра используйте %X, тогда вместо ff будет FF.

Для десятичной системы используйте %d.

Дату тоже можно выводить по разному.

Допустим, при выводе double получается 3.0. Как вывести 3, т.е. без нуля. И с учетом того, что например 3.1 должно выводиться как 3.1. Округление здесь не поможет.

public byte[] getBytes()

Конвертируем строку в набор байтов.

public byte[] getBytes(String charsetName)

Возвращает отформатированную строку, используя прилагаемую кодировку.

public void getBytes(int start, int end, byte[] data, int index) и другие перегруженные версии

Метод сохраняет символы в массив байтов, альтернатива методу getChars(). Часто используется при экспорте строк из различных источников, где используются другие символы Unicode. Например, Java по умолчанию использует 16-битовые символы Unicode, а в интернете часто строки используют 8-битовый код Unicode, ASCII и др.

public void getChars(int start, int end, char[] buffer, int index)

Метод для извлечения нескольких символов из строки. Вам надо указать индекс начала подстроки (start), индекс символа, следующего за концом извлекаемой подстроки (end). Массив, который принимает выделенные символы находится в параметре buffer. Индекс в массиве, начиная с которого будет записываться подстрока, передаётся в параметре index. Следите, чтобы массив был достаточного размера, чтобы в нём поместились все символы указанной подстроки.

public int hashCode()

Возвращает целое число — хэш-код для данного объекта.

public int indexOf(int ch)

Ищет появление указанного символа и возвращает позицию индекса. Если символа нет, то возвращается -1.

public int indexOf (int ch, int fromIndex)

Ищет индекс символа сh, начиная с позиции fromIndex

public int indexOf (String str)

Ищет подстроку str и возвращает индекс найденной подстроки. Если подстроки не существует, то возвращается -1.

public int indexOf (String str, int fromIndex)

Ищет подстроку str, начиная с позиции fromIndex и возвращает индекс найденной подстроки. Если подстроки не существует, то возвращается -1.

Смотри также схожий метод lastIndexOf().

public String intern ()

public boolean isEmpty ()

Проверяет, является ли строка пустой

Данный метод появился в API 9 (Andro >

public int lastIndexOf (String string) и другие перегруженные версии

Метод ищет в строке в обратном порядке и возвращает индекс последнего появления указанного символа. Если указанный символ не найден, то возвратится -1. Например, получить имя файла без расширения можно так:

public static String join (CharSequence delimiter, CharSequence. elements)

Метод появился в API 26. Склеивает слова указанным разделителем. Если слово является null, то null будет использоваться в качестве слова. Есть перегруженная версия.

В этом примере мы получаем позицию последней точки и получаем подстроку до неё.

public int length()

Возвращает длину строки

public boolean matches(String regularExpression)

Проверяет, соответствует ли строка регулярным выражениям.

public int offsetByCodePoints (int index, int codePointOffset)

Возвращает позицию, расположенную на расстоянии codePointOffset после начальной позиции, заданной параметром index

public boolean regionMatches (int thisStart, String string, int start, int length)

Метод сравнивает указанную часть строки с другой частью строки. Нужно задать индекс начала диапазон строки вызывающего объекта класса String. Строка для сравнивания передаётся в параметре string. Индекс символа, начиная с которого нужно выполнять сравнение передаётся в параметре start, а длина сравниваемой подстроки в параметре length.

public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length)

Перегруженная версия. Метод сравнивает указанную часть строки с другой частью строки, игнорируя регистр.

public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии

Меняет символ или последовательность символов target на replacement

public String replaceAll (String regularExpression, String replacement)

Смотри также пример в задачнике — Удаление гласных из строки.

public String replaceFirst (String regularExpression, String replacement)

Удаляет первые символы при помощи регулярного выражения.

Например, если нужно удалить нули в начале чисел 001, 007, 000024, то можно использовать такой вызов.

public String[] split (String regularExpression) и другие перегруженные версии

Разбивает строку на массив из слов. Например, есть строка Васька Рыжик Мурзик Барсик и мы хотим получить массив имён котов:

aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик

Также можно использовать регулярное выражение \s+, чтобы учитывать любые типы пробелов, включая двойные и более пробелы подряд.

public boolean startsWith(String prefix)

Проверяет, начинается ли строка символами prefix с начала строки

public boolean startsWith(String prefix, int start)

Проверяет, начинается ли заданная строка символами prefix с указанной позиции.

public CharSequence subSequence (int start, int end)

Аналогичен методу substring(), но может использоваться для CharSequence.

public String substring(int start) и другие перегруженные версии

Создаёт новую последовательность/строку с символами из данной строки начиная с позиции start до конца строки/заканчивая символом с позиции end. Новая строка содержит символы от start до end — 1, поэтому берём на один символ больше.

Если указать индекс вне границ строки, то возникнет исключение StringIndexOutOfBoundsException.

public char[] toCharArray()

Копирует символы в этой строке в массив символов. Тот же результат можно получить через метод getChars(). Документация не рекомендует использовать данный метод, предлагая метод charAt().

public String toLowerCase() и другие перегруженные версии

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

public String toString ()

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

public String toUpperCase()

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

public String trim()

Удаляет пробелы в начале и в конце строки.

public static String valueOf(long value) и другие перегруженные версии

Конвертирует содержимое (числа, объекты, символы, массивы символов) в строку.

Генерируем случайную строку

Допустим, нам нужна случайная строка из заданных символов.

Сравнение строк: equals() или ==?

Хотя в двух переменных содержится одно и то же слово, мы имеем дело с двумя разными объектами и оператор == вернёт false.

Однажды, когда деревья были большими, мне понадобилось сравнить две строки из разных источников. Хотя строки выглядели совершенно одинаково, сравнение при помощи оператора == возвращало false и путало мне все карты. И только потом я узнал, что нужно использовать метод equals(). Строка в Java — это отдельный объект, который может не совпадать с другим объектом, хотя на экране результат выводимой строки может выглядеть одинаково. Просто Java в случае с логическим оператором == (а также !=) сравнивает ссылки на объекты (при работе с примитивами такой проблемы нет):

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

Есть несколько способов сортировки символов в заданной строке. Рассмотрим их.

Способ первый. Конвертируем строку в массив символов через toCharArray(). Запускаем два цикла. При сравнении символов нужно учитывать их регистр, поэтому мы не только сравниваем разные символы, но и одинаковые, чтобы символы в верхнем и нижнем регистре тоже были отсортированы.

Способ прекрасно работает на английских символах. Но строка "Котёнок" даст неправильный результат: Ккноотё. Символ "ё" попал в самый конец массива.

Способ второй. Обходимся без циклов и используем метод sort().

Проблема с "ё" осталась. При этом появилась другая проблема — сначала идут символы в верхнем регистре, потом в нижнем. Получилось КОкнотё.

Переписываем пример с использованием Comparator.

Проблема с "ё" осталась, но с регистрами всё хорошо.

Кстати, в Java 8 можно использовать Stream для подобных операций. В любом случае будьте внимательные с символами другой локали. Ни один пример не решил наших проблем.

StringTokenizer

Класс StringTokenizer разбивает строку на токены с указанным разделителем.

Строка — это упорядоченная последовательность символов. В Java строка является основным носителем текстовой информации. Для работы со строками здесь используются следующие классы: String, StringBuilder, StringBuffer. В этом уроке речь пойдет о классе String, его на первых порах будет вполне достаточно.

В данном уроке рассматривается:

В уроке 6 уже упоминалась работа со строками, а именно, как создавать строку. Также частично со строками мы встречались в предыдущих уроках. В этом и следующих двух уроках мы углубим знания о строках. В этом уроке будут рассмотрены создание строк в Java и наиболее популярные методы при работе со строками. Следующий урок будет посвящен форматированию строк. И еще один урок будет на тему работы с регулярными выражениями в Java, поскольку регулярные выражения достаточно мощный и нужный инструмент при работе со строками.

Но начнем с самого начала.

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

Строка в Java является объектом, поэтому ее можно создать, как и любой другой объект, при помощи оператора new.

Также строку можно создать при помощи литерала (фразы заключенной в кавычки) следующим образом.

Обе строки, независимо от способа создания являются объектами — экземплярами класса String.

Важный момент: создание объектов при помощи литерала возможно только в классе String. Объекты любого другого класса при помощи литерала создать нельзя.

Можно также создать массив строк. Например, так:

Подробнее о массивах и их создании написано в уроке 10 .

Конкатенация или слияние строк в Java

Для того, чтобы объединить несколько разных строк в одну, в Java можно использовать перегруженные (специально для объектов String) операторы «+» и «=+».

Еще один важный момент : операторы «+» и «=+», перегруженные для String, являются единственными перегруженными операторами в Java. Программист здесь не имеет возможности самостоятельно перегружать какие-либо операторы (как, например, в С++ и некоторых других языках).

Пример 1:

На консоль будет выведено «Мама мыла раму»

Пример 2:

Пример 3:

Наиболее употребительные методы класса String

При использовании IDE можно легко увидеть, какие методы есть у класса и получить подсказку по их использованию. На примере IDE Eclipse: для того, чтобы открыть список методов и быстро выбрать подходящий, нужно после имени переменной поставить точку и нажать комбинацию клавиш CTRL + Space (пробел). После этого появится окно, как на рисунке 14.1, где будут перечислены все доступные методы класса.

При выборе метода из этого списка, справа (или слева) появится желтое окно с подсказкой по его использованию. При помощи нажатия Enter или двойного клика мыши метод можно вставить в ваш код, не прибегая к ручному набору.
Также после имени переменной и точки можно начать набирать вручную имя метода и после введения нескольких первых букв нажать CTRL + Space (пробел). При этом, если метод, начинающийся на эти буквы один, то он автоматически подставится в код, если методов несколько, то откроется окно, как на рисунке 14.1, где будут перечислены только те методы, которые начинаются с этих введенных вами букв.
Это было лирическое отступление о том, как облегчить себе жизнь. Далее рассмотрим методы, которые чаще всего используются при работе со строками. Некоторые задачи можно решить и без применения этих методов, но их знание значительно облегчает процесс программирования. В дальнейшем описании, первое слово, которое стоит перед названием метода — тип значения, которое возникнет в результате работы метода (значение, которое метод возвращает).

Еще раз конкатенация

String concat(String str) — производит ту же конкатенацию, что была описана выше, но использование этого метода из класса String положительно влияет на производительность и скорость программы. На небольших примерах это незаметно и не существенно, но в более серьезных приложениях стоит использовать этот метод. Результатом работы метода будет строка. Параметр, который нужно передавать в метод для конкатенации — тоже строка, о чем нам говорит значение в скобках (String str).

Перепишем пример 2, при помощи concat():

Определение количества символов в строке

Для того чтобы определить количество символов в строке, используется метод length.

int length() возвращает длину строки. Длина равна количеству символов Unicode в строке.

Пример 4:

Извлечение символов из строки

Если нам требуется узнать, какой символ находиться в строке на конкретной позиции, можем использовать метод charAt.

char charAt(int index) возвращает символ, находящийся по указанному индексу в строке. Результатом работы метода будет символ типа char. Параметр, который передается в метод — целое число. Первый символ в строке, подобно массивам, имеет индекс 0.

Пример 5: определить последний символ в строке.

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

char[] toCharArray() — преобразует строку в новый массив символов.

Пример 6: поменять в строке символы пробела на точки при помощи преобразования в массив символов (для этой задачи есть более простое решение, нежели преобразование в массив, но об этом чуть позже).

Примечание: в данном случае мы не сможем использовать метод charAt. При помощи этого метода мы бы смогли только найти пробелы в строке, но не поменять их.

Извлечение подстроки из строки

String substring(int beginIndex, int endIndex) или substring(int beginIndex) — возвращает новую строку, которая является подстрокой используемой строки. В параметрах метода нужно указать индекс строки, с которого начинается подстрока и индекс, которым заканчивается. Также возможно указывать только начальный индекс. В этом случае будет возвращена подстрока от начального индекса и до конца строки.

Пример 7.

Разбиение строк

Для разбиения строк на части используется метод String[] split(String regex), который разбивает строку на основании заданного регулярного выражения. О регулярных выражениях поговорим в одном из следующих уроков. Здесь покажем пример простого разбиения строки заданного одним символом.

Пример 8.

Поиск в строке

boolean contains(CharSequence s) — проверяет, содержит ли строка заданную последовательность символов и возвращает true или false.

Пример 9.

boolean endsWith(String suffix) — проверяет завершается ли строка определенными символами и возвращает true или false.

Пример 10.

boolean startsWith(String prefix) или startsWith(String prefix, int toffset) — проверяет, начинается ли строка с определенных символов. Во втором случае можно указать позицию с которой необходимо начать поиск префикса.

Пример 11.

int indexOf(int ch), indexOf(int ch, int fromIndex), indexOf(String str), indexOf(String str, int fromIndex) — метод indexOf применяется для поиска первого вхождения указанного символа в строке или первого вхождения указанной подстроки. Поиск также можно произвести с указанием позиции в строке от которой нужно начинать искать. Для поиска нужно указать соответствующие параметры. Метод возвращает число соответствующее индексу первого вхождения символа или подстроки. В случае отсутствия указанного символа или подстроки в строке, будет возвращена -1.

Пример 12

int lastIndexOf(int ch), lastIndexOf(int ch, int fromIndex), lastIndexOf(String str), lastIndexOf(String str, int fromIndex) — аналогично предыдущему случаю, только ищется последнее вхождение символа или подстроки в строке.

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

Модификация строк не является модификацией как таковой. Дело в том, что объекты класса String после создания уже нельзя изменять. Но можно создать копию строки с изменениями. Именно это и делают следующие методы.
toLowerCase() — преобразовать строку в нижний регистр;
toUpperCase() — преобразовать строку в верхний регистр;
trim() — отсечь на концах строки пустые символы;

String replace(char oldChar, char newChar), replace(CharSequence target, CharSequence replacement) — замена в строке одного символа или подстроки на другой символ или подстроку.

Вспомним пример 6, где нужно было поменять в строке символы пробела на точки и перепишем его с использованием replace:

Сравнение строк

boolean equals(Object anObject) — проверяет идентичность строк. Возвращает true только в том случае, если в строках представлена одинаковая последовательность символов одной величены.

Пример 14

int compareTo(String anotherString) — так же проверяет идентичность строк, однако, в отличии от метода equals возвращает:

  • нулевое значение, если строки равны,
  • целое отрицательное число, если первая строка предшествует второй
  • целое положительное число, если первая строка следует за второй

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

Рассмотрим пример с именами «Маша» и «Миша». При сравнении этих двух имен (пример 15), метод compareTo укажет, что имя «Маша» предшествует имени «Миша» (выдав отрицательное число) или наоборот, «Миша» следует за «Маша» (выдав положительное число). При упорядочивании имен по алфавиту мы бы упорядочили эти имена именно так. Метод в данном случае определяет, что числовое значение буквы «а» в «Маша» меньше, чем числовое значение «и» в Миша.

Пример 15

Однако, в случае, если мы напишем «маша» с маленькой буквы и попробуем сравнить с «Миша», то получим положительное число.

То есть в данном случае имя «Миша» предшествует имени «маша». Это происходит потому, что в таблице символов Юникода буквы верхнего регистра предшествуют нижнему.

Для сравнения строк без учета регистра символов используется функция int compareToIgnoreCase(String str)

Как мы видим, при сравнивании «маша» с «Миша» мы снова получаем отрицательное значение, то есть «маша» предшествует имени «Миша».

Каков наилучший способ извлечения подстроки из строки в android?

Если вы знаете индекс начала и конца, вы можете использовать

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

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

Если вы хотите получить подстроку после определенного символа, добавьте это число в .indexOf(char) :

Вот пример реального мира:

В примере asubstring вернется: h

Использовать текст unold class от android:
TextUtils.substring (charsequence source, int start, int end)

Вы можете использовать subSequence, это то же самое, что и substr в C

Есть и другой способ, если вы хотите получить строку sub до и после символа

Проверьте это сообщение, как найти до и после подстроки в строке

Вы можете использовать этот код

В этой mainString есть супер string.like «I_AmANDROID.Devloper», а lastString – строка типа «.». И startString как «_». Поэтому эта function возвращает «Аманда». Наслаждайтесь кодовым временем. 🙂

Лучший способ получить подстроку в Android – использовать (как сказал @ user2503849) TextUtlis.substring(CharSequence, int, int) . Я могу объяснить, почему. Если вы посмотрите на метод String.substring(int, int) из android.jar (новейший API 22), вы увидите:

Ок, а … Как вы думаете, как выглядит частный конструктор String(int, int, char[]) ?

Как мы видим, он ссылается на массив «old» value char[] . Таким образом, GC не может его освободить.


[an error occurred while processing the directive]
Карта сайта