Как убрать повторяющиеся символы из строки в java
Как убрать повторяющиеся символы из строки в java
Для соединения строк можно использовать операцию сложения (“+”):
При этом если в операции сложения строк используется нестроковый объект, например, число, то этот объект преобразуется к строке:
Фактически же при сложении строк с нестроковыми объектами будет вызываться метод valueOf() класса String. Данный метод имеет множество перегрузок и преобразует практически все типы данных к строке. Для преобразования объектов различных классов метод valueOf вызывает метод toString() этих классов.
Другой способ объединения строк представляет метод concat() :
Метод concat() принимает строку, с которой надо объединить вызывающую строку, и возвращает соединенную строку.
Еще один метод объединения – метод join() позволяет объединить строки с учетом разделителя. Например, выше две строки сливались в одно слово “HelloJava”, но в идеале мы бы хотели, чтобы две подстроки были разделены пробелом. И для этого используем метод join() :
Метод join является статическим. Первым параметром идет разделитель, которым будут разделяться подстроки в общей строке, а все последующие параметры передают через запятую произвольный набор объединяемых подстрок – в данном случае две строки, хотя их может быть и больше
Извлечение символов и подстрок
Для извлечения символов по индексу в классе String определен метод char charAt(int index) . Он принимает индекс, по которому надо получить символов, и возвращает извлеченный символ:
Как и в массивах индексация начинается с нуля.
Если надо извлечь сразу группу символов или подстроку, то можно использовать метод getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) . Он принимает следующие параметры:
srcBegin : индекс в строке, с которого начинается извлечение символов
srcEnd : индекс в строке, до которого идет извлечение символов
dst : массив символов, в который будут извлекаться символы
dstBegin : индекс в массиве dst, с которого надо добавлять извлеченные из строки символы
Сравнение строк
Для сравнения строк используются методы equals() (с учетом регистра) и equalsIgnoreCase() (без учета регистра). Оба метода в качестве параметра принимают строку, с которой надо сравнить:
В отличие от сравнения числовых и других данных примитивных типов для строк не применяется знак равенства ==. Вместо него надо использовать метод equals() .
Еще один специальный метод regionMatches() сравнивает отдельные подстроки в рамках двух строк. Он имеет следующие формы:
Метод принимает следующие параметры:
ignoreCase : надо ли игнорировать регистр символов при сравнении. Если значение true , регистр игнорируется
toffset : начальный индекс в вызывающей строке, с которого начнется сравнение
other : строка, с которой сравнивается вызывающая
oofset : начальный индекс в сравниваемой строке, с которого начнется сравнение
len : количество сравниваемых символов в обеих строках
В данном случае метод сравнивает 3 символа с 6-го индекса первой строки (“wor”) и 3 символа со 2-го индекса второй строки (“wor”). Так как эти подстроки одинаковы, то возвращается true .
И еще одна пара методов int compareTo(String str) и int compareToIgnoreCase(String str) также позволяют сравнить две строки, но при этом они также позволяют узнать больше ли одна строка, чем другая или нет. Если возвращаемое значение больше 0, то первая строка больше второй, если меньше нуля, то, наоборот, вторая больше первой. Если строки равны, то возвращается 0.
Для определения больше или меньше одна строка, чем другая, используется лексикографический порядок. То есть, например, строка “A” меньше, чем строка “B”, так как символ ‘A’ в алфавите стоит перед символом ‘B’. Если первые символы строк равны, то в расчет берутся следующие символы. Например:
Поиск в строке
Метод indexOf() находит индекс первого вхождения подстроки в строку, а метод lastIndexOf() – индекс последнего вхождения. Если подстрока не будет найдена, то оба метода возвращают -1:
Метод startsWith() позволяют определить начинается ли строка с определенной подстроки, а метод endsWith() позволяет определить заканчивается строка на определенную подстроку:
Замена в строке
Метод replace() позволяет заменить в строке одну последовательность символов на другую:
Обрезка строки
Метод trim() позволяет удалить начальные и конечные пробелы:
Метод substring() возвращает подстроку, начиная с определенного индекса до конца или до определенного индекса:
Изменение регистра
Метод toLowerCase() переводит все символы строки в нижний регистр, а метод toUpperCase() – в верхний:
Split
Метод split() позволяет разбить строку на подстроки по определенному разделителю. Разделитель – какой-нибудь символ или набор символов передается в качестве параметра в метод. Например, разобьем текст на отдельные слова:
В данном случае строка будет разделяться по пробелу. Консольный вывод:
убрать – удаление одинаковых символов из строки java
Как удалить повторяющиеся пробелы в строке с помощью Java? (6)
Как удалить повторяющиеся пробелы (включая вкладки, новые строки, пробелы и т. Д.) В строке с использованием Java?
hi самый быстрый (но не самый красивый способ), который я нашел
это работает довольно быстро на android в противоположность регулярному выражению
Вы можете использовать регулярное выражение
замените его на $1 .
Если вход “foottbar ” вы получите “footbar ” качестве вывода
Но если вход “foot bar” он останется неизменным, поскольку он не имеет последовательных символов пробела.
Если вы обрабатываете все пробельные символы (пробел, вертикальную вкладку, горизонтальную вкладку, возврат каретки, фид формы, новую строку) в качестве пробела, вы можете использовать следующее регулярное выражение, чтобы заменить любое количество последовательных пробелов одним пробелом:
Но если вы хотите заменить два последовательных пробела одним пространством, вы должны сделать:
Если вы хотите избавиться от всех ведущих и конечных посторонних пробелов, вы хотите сделать что-то вроде этого:
Затем вы можете удалить дубликаты, используя другие стратегии, перечисленные здесь:
Что означает это s+ ?
s+ – регулярное выражение. s соответствует пробелу, вкладке, новой строке, возврату каретки, фиду формы или вертикальной вкладке и + говорит «один или несколько из них». Таким образом, приведенный выше код скроет все «пробельные подстроки» длиннее одного символа с одним символом пробела.
Хотя уже слишком поздно, я нашел лучшее решение (которое работает для меня), которое заменит все белые пробелы одного и того же типа одним белым пространством своего типа. То есть:
Обратите внимание, что есть все еще ведущие и завершающие пробелы. Поэтому мое полное решение:
Здесь trim() заменяет все начальные и конечные строки пробела на «». (\s) – для захвата \s (то есть белых пространств, таких как ”, ‘ n’, ‘ t’) в группе # 1 . + для сопоставления 1 или более предшествующих токенов. Таким образом, (\s)+ могут быть последовательными символами (1 или более) среди любых одиночных символов пробела (”, ‘ n’ или ‘ t’). $1 – это замена строк соответствия строкой группы # 1 (которая содержит только 1 символ пробела) типа соответствия (то есть совпадающего символа одиночного пробела). Вышеупомянутое решение изменится следующим образом:
Я не нашел мое решение выше, поэтому я разместил его.
Это можно сделать в три этапа:
- Преобразование строки в массив символов (ToCharArray)
- Применить для цикла на charater array
- Затем примените функцию замены строки (Replace («sting, которую вы хотите заменить», «оригинальная строка»));
Как удалить повторяющиеся символы из строки в Java
Я просто хочу получить помощь по удалению дубликатов. До сих пор у меня есть это, но он не удаляет и не удаляет слова, которые возникали много раз.
5 Ответов
Если вам не разрешено использовать дополнительную память и очень удобные наборы Java, тогда есть имплицитный алгоритм, чтобы сделать то, что вы хотите, это O(NlogN) вместо очевидного решения O(N^2), которое вы предлагаете.
Пояснить пункт 2 :
теперь мы фильтруем Xs:
Это на самом деле O(nlogn + 2n), который может быть упрощен до O(nlogn).
Удачи с реализацией, но это должно быть довольно просто. Если вы не можете использовать Arrays.sort(
) реализовать свою собственную функцию сортировки, я предлагаю QuickSort или MergeSort, поскольку они определяют общую производительность этого решения.
Вы можете хранить элементы в HashSet, что автоматически удаляет повторение
Вы можете добавить строки в HashSet, он удаляет дубликаты.
Когда вы заменяете текст в файле, я часто читаю весь файл в память, делаю любые манипуляции, которые я хочу сделать, а затем записываю все это обратно в файл. Мне не нравится раздавать ответ, поэтому я дам вам что-то подобное. Например, в псевдокоде:
Вопрос немного неясен, но я предполагаю, что вы хотите прочитать содержимое файла, удалить дубликаты и записать его обратно в файл.
Если у вас есть содержимое файла (см. Этот вопрос для рекомендаций: чтение обычного текстового файла в Java ), то самый простой способ удалить дубликаты из списка-поместить их в набор:
Если у вас есть набор уникальных строк, вы можете просто записать их обратно в файл (см. Этот вопрос для рекомендаций: как создать файл и записать его в Java? )
Похожие вопросы:
Я понятия не имею, как удалить недопустимые символы из строки в Java. Я пытаюсь удалить все символы, которые не являются цифрами, буквами или ( ) [ ] . Как я могу это сделать? Спасибо
Глядя на одну строку C# код, который бы удалить повторяющиеся символы из строки. Сделали это с помощью простого цикла с look-ahead, но хотели бы видеть regex soln. Экс. вход =.
Можно ли удалить повторяющиеся символы из строки, не сохраняя каждый символ, который вы видели в массиве,и не проверяя, есть ли в этом массиве новые символы? Это кажется крайне неэффективным.
Мне нужно удалить повторяющиеся символы из строки, например: abcdab => abcd aaabbc => abc Как это сделать на JS (maybee с помощью $.уникальный или что-то еще) ?
Я нашел способ удалить повторяющиеся символы из строки с помощью регулярных выражений. function RemoveDuplicates() < var str = aaabbbccc; var filtered = str.replace(/[^ws]|(.)1/gi, );.
Мне нужно удалить все повторяющиеся строки из файла, но игнорируя все появления этих символов: (),、“”。!?# Например, эти две строки будут считаться дубликатами, поэтому одна из них будет удалена.
У меня есть строка, например, acaddef или bbaaddgg . Я должен удалить из него, как можно быстрее, все повторяющиеся символы. Так, например, pooaatat после должно выглядеть как poat и ggaatpop должно.
Как я могу удалить соседние повторяющиеся символы в строке без учета регистра? Например: string = ‘HaPpy Bbirthday. ‘ Ожидаемый Результат: ‘Hay irthday’ Примечание : были удалены только соседние.
Я хочу удалить повторяющиеся строки из Матрицы. Я читал, как я могу удалить дубликаты в массиве, но сохранить тот же порядок? но это не совсем то, чего я хочу. Решение выше удаляет повторяющиеся.
может ли кто-нибудь предложить мне, как удалить повторяющиеся символы из строки в java и тоже без использования строковых функций. Как я знаю, мы преобразуем заданную строку в символьный массив, а.
Как убрать повторяющиеся символы из строки в java
Строка — это упорядоченная последовательность символов. В 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)
Как мы видим, при сравнивании «маша» с «Миша» мы снова получаем отрицательное значение, то есть «маша» предшествует имени «Миша».
Как убрать повторяющиеся символы из строки в java
4420 просмотра
6 ответа
1689 Репутация автора
У меня есть ArrayList из String й и содержат записи , такие как:
Мне нужно очистить этот список, чтобы вывод не содержал повторяющегося содержимого. В случае выше, результат должен быть:
как видите, 3-я строка была изменена и теперь содержит только один оператор what’s up man вместо двух. В моем списке есть ситуация, когда иногда String верна, а иногда она удваивается, как показано выше.
Я хочу избавиться от этого, поэтому я подумал об итерации по этому списку:
но я не могу найти способ устранения дубликатов, тем более что длина каждой строки не определена, и под этим я подразумеваю, что может быть запись:
или иногда короткие:
может быть, есть какая-то нативная функция Java для этого?
Ответы (6)
1 плюс
1545 Репутация автора
- Прописные слова равны строчным аналогам.
Автор: Veneet Reddy Размещён: 13.03.2017 06:36
плюса
80 Репутация автора
Это зависит от ситуации, в которой вы находитесь, но при условии, что строка может повторяться не более двух раз, а не три или более раз, когда вы можете найти длину всей строки, найти точку на полпути и сравнить каждый индекс после точки на полпути с соответствующим Начальный индекс. Если строка может повторяться более одного раза, вам потребуется более сложный алгоритм, который сначала определит, сколько раз строка повторяется, а затем найдет начальный индекс каждого повторения и урежет все индексы с начала первого повторения и далее. Если вы можете предоставить больше контекста для возможных сценариев, которые вы ожидаете реализовать, мы можем начать собирать некоторые идеи.
2 плюса
649 Репутация автора
Предполагая, что String повторяется всего два раза и с пробелом между ними, как в ваших примерах, следующий код удалит повторения:
Код просто разбивает каждую запись списка на две подстроки (деление на половину точки). Если оба значения равны, замените исходный элемент только одной половиной, удалив повторение.
Я тестировал код и не видел ответа @Brendan Robert. Этот код следует той же логике, что и его ответ.
Автор: airos Размещён: 13.03.2017 06:43
1 плюс
1074 Репутация автора
Простая логика: разбить каждое слово на пробел, то есть “”, и теперь добавить его в LinkedHashSet, получить обратно, заменить “[“, “]”, “,”
о / п: я хочу гулять с моей собакой
2 плюса
478 Репутация автора
Я бы предложил использовать регулярные выражения. Мне удалось удалить дубликаты, используя этот шаблон: b([ws’]+) 1b
Как убрать повторяющиеся символы из строки в java
Со строками можно производить операцию сцепления строк (concatenation), обозначаемую знаком плюс +. Эта операция создает новую строку, просто составленную из состыкованных первой и второй строк, как показано в начале данной главы. Ее можно применять и к константам, и к переменным. Например:
String attention = “Внимание: “;
String s = attention + “неизвестный символ”;
Вторая операция — присваивание += — применяется к переменным в левой части:
attention += s;
Поскольку операция + перегружена со сложения чисел на сцепление строк, встает вопрос о приоритете этих операций. У сцепления строк приоритет выше, чем у сложения, поэтому, записав “2” + 2 + 2 , получим строку ” 222 “. Но, записав 2 + 2 + “2” , получим строку “42”, поскольку действия выполняются слева направо. Если же запишем “2” + (2 + 2) , то получим “24” .
Выбрать символ с индексом 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) .
Метод 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 , вычисленное по следующим правилам:
- Сравниваются символы данной строки this и строки str с одинаковым индексом, пока не встретятся различные символы с индексом, допустим k , или пока одна из строк не закончится.
- В первом случае возвращается значение this.charAt(k) – str.charAt(k), т. е. разность кодировок Unicode первйх несовпадающих символов.
- Во втором случае возвращается значение this.length() – str.length() , т. е. разность длин строк.
- Если строки совпадают, возвращается 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 порядке. Если символ ch не найден, возвращается.-1.
Например, “Молоко”.lastindexof(‘о’) даст в результате 5.
Предпоследнее и предыдущие появления символа ch в данной строке this можно отследить методом lastIndexof (int ch, int ind) , который просматривает строку в обратном порядке, начиная с индекса ind .
Если ind больше длины строки, то поиск идёт от конца строки, если ind Будьте осторожны, устанавливая новую длину объекта. Количество символов в строке можно узнать, как и для объекта класса String , методом length () , а емкость — методом capacity ().
Создать объект класса stringBuf fer можно только конструкторами.
В классе stringBuffer три конструктора:
stringBuffer () — создает пустой объект с емкостью 16 символов;
stringBuffer .(int capacity) — создает пустой объект заданной емкости capacity ;
StringBuffer (String str) — создает объект емкостью str . length () + 16, содержащий строку str .
В классе stringBuffer есть десять методов append (), добавляющих подстроку в конец строки. Они не создают новый экземпляр строки, а возвращают ссылку на ту же самую, но измененную строку.
Основной метод append (string str) присоединяет строку str в конец данной строки. Если ссылка str == null, то добавляется строка “null”.
Шесть методов append (type elem) добавляют примитивные типы boolean, char, int, long, float, double, преобразованные в строку.
Два метода присоединяют к строке массив str и подмассив sub символов,
преобразованные в строку: append (char [] str) И append (char [.] , sub, int offset, int len).
Десятый метод добавляет просто объект append (Object obj). Перед этим объект obj преобразуется в строку своим методом tostring ().
Десять методов insert () предназначены для вставки строки, указанной параметром метода, в данную строку. Место вставки задается первым параметром метода ind . Это индекс элемента строки, перед которым будет сделана вставка. Он должен быть неотрицательным и меньше длины строки, иначе возникнет исключительная ситуация. Строка раздвигается, емкость буфера при необходимости увеличивается. Методы возвращают ссылку ни ту же преобразованную строку.
Основной метод insert (int ind, string str) вставляет строку str в данную строку перед ее символом с индексом and . Если ссылка s tr == null вставляется строка “null”.
Например, после выполнения
String s = new StringBuffer(“Это большая строка”). insert(4, “не”).toString();
ПОЛУЧИМ s == “Это небольшая строка”.
Метод sb.insert(sb.length о, “xxx”) будет работать так же, как метод
sb.append(“xxx”) .
Шесть методов insert (int ind, type elem) вставляют примитивные типы boolean, char, int, long, float, double, преобразованные в строку.
Два метода вставляют массив str и подмассив sub символов, преобразованные в строку:
i nsert(int ind, chart] str)
insert(int ind, char[] sub, int offset, int len)
Десятый метод вставляет просто объект :
insert(int ind, Object obj)
Объект obj перед добавлением преобразуется в строку своим методом
toString ().
Метод delete tint begin, int end) удаляет из строки символы, начиная с индекса begin включительно до индекса end исключительно, если end больше длины строки, то до конца строки.
Например, после выполнения
String s = new StringBuffer(“Это небольшая строка”).
delete(4, 6).toString();
получим s == “Это большая строка”.
Если begin отрицательно, больше длины строки или больше end , возникает исключительная ситуация.
Если begin == end, удаление не происходит.
Метод deieteCharAt (int ind) удаляет символ с указанным индексом ind . Длина строки уменьшается на единицу.
Если индекс ind отрицателен или больше длины строки, возникает исключительная ситуация.
Метод replace (int begin, int end. String str ) удаляет символы из строки, начиная с индекса begin включительно до индекса end исключительно, если end больше длины строки, то до конца строки, и вставляет вместо них строку str .
Если begin отрицательно, больше длины строки или больше end , возникает исключительная ситуация.
Разумеется, метод replace () — это последовательное выполнение методов
delete () и insert ().
Метод reverse о меняет порядок расположения символов в строке на обратный порядок.
Например, после выполнения
String s = new StringBuffer(“Это небольшая строка”),
reverse().toString();
получим s == “акортс яашьлобен отЭ”.