В этой короткой заметке мы рассмотрим несколько способов вывести строку в обратном порядке: напишем парочку своих «велосипедов» и посмотрим на возможности реверса строк, которые предоставляет Java из коробки.
Способы перевернуть строку в Java
В примерах ниже мы попробуем вывести строку в реверсном режиме разными способами, а именно: рекурсивно и с использованием методов charAt()
, toCharArray()
и StringBuffer()
.
Рекурсивный метод
Первым делом давайте попробуем реализовать вывод строки в обратном порядке с помощью «велосипедной рекурсии» :).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public static String reverseStringWithRecursion(String inputString) { String rightPart; String leftPart; int length = inputString.length(); // заканчиваем рекурсивный обход if (length <= 1) { return inputString; } leftPart = inputString.substring(0, length / 2); rightPart = inputString.substring(length / 2, length); // рекурсивно переворачиваем левую и правую часть входной строки return reverseStringWithRecursion(rightPart) + reverseStringWithRecursion(leftPart); } |
Суть этого метода сводится к тому, чтобы рекурсивно разделять входную строку на две части, уменьшая с каждым разом длину входной строки. Как только длина этой строки уменьшится до одного символа, это будет означать, что переворачивание фрагмента закончено и эти фрагменты будут собраны воедино. В итоге на выход мы получаем новую строку в обратном порядке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// пример работы рекурсивного способа // вручную считаем для строки "java": При первом проходе длина строки = 4, а левая и правая части: leftString = "ja" rightString = "va" // проход закончен так: return "va" + "ja" Теперь "va" + "ja" уже по отдельности опять проходят через этот метод: пример для "va": leftString = "v" rightString = "a" // проход закончен так: return "a" + "v" пример для "ja": leftString = "j" rightString = "a" // проход закончен так: return "a" + "j" в итоге на выход получаем "avaj" |
Рекурсивный метод на выход выдаст тот же результат.
Переворачиваем строку с помощью charAt()
Другим способом является проход по символам в строке с помощью метода charAt()
и сохранение строки с обратным порядком символов. Смотрим на примере:
1 2 3 4 5 6 7 8 |
public static String reverseStringWithCharAt(String inputString) { int stringLength = inputString.length(); String result = ""; for (int i = 0; i < stringLength; i++) { result = inputString.charAt(i) + result; } return result; } |
В коде выше мы в цикле обходим входную строку и по индекску забираем символ. Далее пересоздаем результирующую строку с новым символом вначале.
Выводим строку в обратном порядке с помощью toCharArray()
Этот способ очень похож на предыдущий, но вместо charAt()
мы представляем строку в виде массива символов используя метод toCharArray()
и затем в обратном порядке присваиваем символы результирующей строке. Смотрим пример:
1 2 3 4 5 6 7 8 |
public static String reverseWithCharArray(String inputString) { char[] charArray = inputString.toCharArray(); String resultString = ""; for (int i = charArray.length - 1; i >= 0; i--) { resultString += charArray[i]; } return resultString; } |
Используем StringBuffer или StringBuilder для переворачивания строки в Java
В этом способе мы воспользуемся методами для вывода строки в обратном порядке, которые строенны в Java и не требуеют с нашей стороны никаких обработок. Все, что нам нужно использовать — это класс StringBuffer
и его метод reverse()
:
1 2 |
String inputString = "java"; String reversedString = new StringBuffer(inputString).reverse().toString(); |
Вот так в две строчки кода мы избавились от необходимости писать отдельные методы для переворота строки — Java за нас делает всю работу. Интересно знать, что внутри метода reverse()
происходит сложный процес создания новой перевернутой строки со множеством проверок и оптимизаций быстродействия, о которых мы не задумывались в наших тестовых программках.
Подробнее о работе со строками читайте здесь.
Используете ли вы какой-то из этих способов в своих проектах? Также пишите свои методы в комментариях!
В «велосипедной рекурсии» возвращает это:
return reverseStringWithRecursion(rightPart) + reverseStringWithRecursion(leftPart);
Тут точно никакой ошибки? если нет, то объясните, как вычислении возвращаемого значения может вызываться та же самая функция? Я в этом деле пока новичок…
Все, понял. Вопрос отпал
В общем случае вместо StringBuffer рекомендуется использовать StringBuilder, у него тоже есть метод reverse().
Способ «Переворачиваем строку с помощью charAt()» неправильно написан, строка будет в том же порядке
Надо поправить направление цикла, с конца.
Беру свои слова обратно. Все нормально в методе, невнимательно смотрел