Как сделать строку наоборот на java

Обновлено: 07.07.2024

Для соединения строк можно использовать операцию сложения ("+"):

При этом если в операции сложения строк используется нестроковый объект, например, число, то этот объект преобразуется к строке:

Фактически же при сложении строк с нестроковыми объектами будет вызываться метод 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() позволяет разбить строку на подстроки по определенному разделителю. Разделитель - какой-нибудь символ или набор символов передается в качестве параметра в метод. Например, разобьем текст на отдельные слова:

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

Потенциально существуют десятки различных способов сделать это, за исключением встроенной функции реверса , поскольку в JavaScript ее нет.

Ниже приведены три моих самых интересных способа решения проблемы обращения строки в JavaScript.

Алгоритм Challenge

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

Ваш результат должен быть строкой.

Предоставляемые тестовые примеры

1. Обращение строки с помощью встроенных функций

Для этого решения мы будем использовать три метода: метод String.prototype.split (), метод Array.prototype.reverse () и метод Array.prototype.join ().

  • Метод split () разбивает объект String на массив строк, разделяя строку на подстроки.
  • Метод reverse () переворачивает массив на месте. Первый элемент массива становится последним, а последний - первым.
  • Метод join () объединяет все элементы массива в строку.

Объединение трех методов вместе:

2. Переверните строку с помощью убывающего цикла For

Без комментариев:

3. Обратить строку с помощью рекурсии

  • Метод substr () возвращает символы в строке, начиная с указанного места и заканчивая указанным количеством символов.
  • Метод charAt () возвращает указанный символ из строки.

Глубина рекурсии равна длине String. Это решение не лучшее и будет очень медленным, если строка очень длинная, а размер стека имеет большое значение.

Без комментариев:

Условный (тернарный) оператор:

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

Три способа повторить строку в JavaScript

Два способа подтвердить окончание строки в JavaScript

Три способа факторизации числа в JavaScript

Два способа проверки палиндромов в JavaScript

Три способа найти самое длинное слово в строке в JavaScript

Три способа указать заглавие предложения в JavaScript

Если у вас есть собственное решение или какие-либо предложения, поделитесь ими ниже в комментариях.

Или вы можете подписаться на меня в Medium , Twitter, Github и LinkedIn сразу после того, как нажмете зеленое сердце ниже ;-)

Как в большинстве других языков программирования, строка в Java – это последовательность символов. Но, в отличие от многих языков, которые реализуют строки как символьные массивы, в Java строки реализуются как объекты типа String .

Реализация строк в виде встроенных объектов обеспечивает полный комплект свойств, которые делают обработку строк очень удобной. Например, в Java существуют методы для сравнения двух строк, поиска подстроки, конкатенации (сцепления) двух строк и изменения регистра символов строки. Имеется несколько способов создания String-объектов , что облегчает их построение.

Несколько неожиданно, что после создания String-объекта символы, входящие в строку, нельзя изменять. Сначала это кажется серьезным ограничением. Однако это не так. Над этим объектом можно выполнять все типы строковых операций. Для того чтобы изменить версию существующей строки, нужно создать новый объект типа String , который содержит необходимую модификацию. Исходная строка остается неизменной. Этот подход используется, потому что фиксированные, неизменяемые строки можно реализовать более эффективно, чем изменяемые. Для тех случаев, когда желательна изменяемая строка, существует компаньон класса String с именем StringBuffer , чьи объекты содержат строки, которые могут изменяться после их создания.

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

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

Чтобы создать пустой объект типа String , необходимо поступить следующим образом:
String s = new String ();

Данная операция создает экземпляр класса String , не содержащий символов (пустую строку).

Часто необходимо создавать строки с начальными значениями. Чтобы создать String-объект , инициализированный массивом символов, используйте следующий конструктор:
String(char chars[])
Например:

Этот конструктор инициализирует (объектную) переменную s строкой "abc" .

Длина строки в Java

Длина строки определяется количеством содержащихся в ней символов. Для получения этого значения вызовите метод length() в форме:
int length ()
Следующий фрагмент выведет число 3 , т. к. в строке s имеется три символа:

Специальные строковые операции Java

Поскольку работа со строками – обычная и очень важная часть программирования, в синтаксис языка Java добавлена поддержка для некоторых специальных строковых операций. К этим операциям относятся автоматическое создание новых String-объектов из строковых литералов, конкатенация множественных String-объектов при помощи операции + и преобразование других типов данных в строковое представление. Существуют явные методы для реализации всех этих функций, но Java выполняет их автоматически как для удобства программиста, так и для того, чтобы сделать запись программы более ясной.

Строковые литералы Java

Строковые литералы в Java определяются так же, как в большинстве других языков – включением последовательности символов между парой двойных кавычек. Примеры строковых литералов:

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

Предыдущие примеры показали, как можно явно создавать String-объекты из массива символов, используя операцию new . Однако есть более простой способ – можно для этой же цели использовать строковый литерал. Для каждого строкового литерала в программе Java автоматически создает String-объект. Например, следующий кодовый фрагмент создает две эквивалентные строки:

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

Строковый пул Java

Строковый пул в java — пример шаблона разработки
‘облегчения’ (flyweight). То есть по возможности не создавать
копии завершенных объектов и не удалять их пока они используются.

Ниже приведены некоторые плюсы которые дает строковый пул:

  • на одну и ту же строку могут ссылаться различные объекты
  • кеширование строк
  • уменьшение расхода памяти (результат первого)
  • нет нужды в синхронизации на них в многопоточных приложениях
  • при этом кешируется и хеш код строки, а значит повышается
    быстродействие объектов типа HashMap;

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

Явно сохранить строку в пуле можно методом intern. Интернирование иногда используется для оптимизации программы, чтобы вместо equal использовать ==.

Где-то читал, что имена классов также сохраняются в пуле. Но в андроиде на одном из устройств (Sony Erricson Xperia mini) это оказалось не так, пришлось их интернировать явно.

Преобразование данных в строки и обратно

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

Для преобразования классов в строку переопределяется метод toString(). По умолчанию он возвращает имя класса.

Другой способ преобразования в строку — использование апи по форматированию строк по шаблону.

числа в строки

  • String.valueOf(простой_тип) — создание строки из значения простого типа;
  • Integer.toBinaryString(int i) — записать число в двоичной системе (как беззнаковое число);
  • Integer.toHexString(int i) — записать число в шестнадцатиричной системе (как беззнаковое число);
  • Integer.toOctalString(int i) — записать число в восьмеричной системе (как беззнаковое число);

Строки в числа

  • Long.parseLong(String s) — возвращает число типа long, записанное в виде строки (целое знаковое десятичное число);
  • Long.valueOf(String s) — аналогично предыдущему, но возвращает объект типа Long;
  • Long.parseLong(String s, int radix) — возвращает число типа long записанное в указанной системе исчесления (с основанием до 36);
  • Long.valueOf(String s, int radix) — аналогично предыдущему, но возвращает объект типа Long;

Аналогичные методы имеют классы Integer, Short, Float, Double.

дата, время и строки

Для преобразования даты и времени в строку и обратно используется класс SimpleDateFormat.

Форматирование строк по шаблону

Форматирование строки в стиле функции printf языка C поддерживается с помощью:

  • Formatter — класс для форматирования строки;
  • Formattable — интерфейс форматирования для объектов;
  • System.out.printf(…) — форматированный вывод в системную консоль;
  • String.format(…) — создание отформатированной строки;

Естественно форматирование адаптировано к языку java, т.е. поддерживаются такие java типы как byte, BigDecimal и Calendar. Более жесткая проверка типов. Возможность использования локализации.

структура шаблона

преобразования

интерфейс Formattable

Первоначальные элементы массива : - 3 12 2 0 - 4 7 9 - 1 - 4 11 14 1 0 13 - 4 0 10 11 14 8

Переработонные элементы массива : 8 14 11 10 0 - 4 13 0 1 14 11 - 4 - 1 9 7 - 4 0 2 12 - 3

Возвратили и обработали массив : 8 14 11 10 0 - 4 13 0 1 14 11 - 4 - 1 9 7 - 4 0 2 12 - 3

[ 8 , 14 , 11 , 10 , 0 , - 4 , 13 , 0 , 1 , 14 , 11 , - 4 , - 1 , 9 , 7 , - 4 , 0 , 2 , 12 , - 3 ]

Код программы. Пример №2

int [ ] res = new int [ arr . length ] ; //Создаём временный массивчик

System . out . print ( "Первоначальные элементы массива: " ) ;

System . out . print ( "\nПереработонные элементы массива: " ) ;

System . out . print ( "\nВозвратили и обработали массив: " ) ;

Один из популярнейших вопросов

Один из популярнейших вопросов на интервью для java-девелопера это просьба перевернуть массив. Это очень похоже на вопрос из прошлой статьи, про переворачивание строки, но немного про другое. Вопрос не выглядит сложным, все что нужно сделать это создать новый массив такого же размера, перебрать исходный массив от конца до нажала заполняя новый. Все, готово. Но нет, мы же создали дополнительный массив того же размера, что и исходный, что усложняет наше решение O(n). Мы не сможем использовать наше решение, если размер массива очень большой (например 10 млн элементов), а размер heap небольшой. Что мы можем тут сделать? Как улучшить наше решение? Можем ли мы перевернуть массив не создавая дополнительный буффер? Для нашей задачи предположим, что у нас массив из integer (вообще на интервью хорошая практика задавать правильные вопросы в правильных местах, как говорят знающие люди это черта хорошего программиста). Ключевое тут понять, что вам нужно перевернуть исходный массив, мы не можем использовать другой массив, но использовать одну две дополнительные переменные, вполне допустимо. Так же недопустимо использование сторонних библиотек или Java API которые могут сделать эту работу за нас, а также методов класса java.util.Arrays, за исключением Arrays.toString() чтобы выводить массивы. Когда наши требования выяснены приступим к решению задачи.

Первое что приходит в голову это перебрать все элементы массива и поменять их местами. Первый элемент и последний, второй элемент с предпоследним, и т.д. В этом случае все элементы массивы будут перевернуты без использования дополнительного буффера. Ключевая вещь здесь, которую нужно держать в голове это только что нам нужно менять местами элементы до того момента как мы достигнем середины массива, иначе мы получим тот же самый массив. Возникает закономерный вопрос, а что если массив имеет четное количество элементов? В этом случае в середине массива будут два элемента, и нам нужно поменять их местами, поэтому наше условие перебора будет содержать выражение index

11 марта 2015 Мария (admin)

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

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

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

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

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

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

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

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

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

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

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

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

Пример 1:

Пример 2:

Пример 3:

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

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

Рис. 14.1

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

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

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

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

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

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

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

Пример 4:

Если мы хотим работать со строкой, как с массивом символов, можем конвертировать строку в массив при помощи метода 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

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


Категория: Уроки Java

Читайте также: