Как развернуть строку в kotlin
Перейти к содержимому

Как развернуть строку в kotlin

  • автор:

Строки

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

 // Java println("Привет " + catName + "! Как дела?"); 

Кстати, такой код тоже будет работать, но первый способ гораздо удобнее.

Мы понимаем, что речь идёт о строке, поэтому можно было написать код без указания типа.

 val catName = "Барсик" 

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

 println("Привет \$catName! Как дела?") // выводится: Привет $catName! Как дела? 

Мы использовали так называемый «строковый шаблон». За кулисами происходит соединение при помощи StringBuilder, но более удобным и быстрым способом.

Длину строки можно вычислить через функцию count().

 val murzik = "Мурзик" println(murzik.count()) 

Функции-расширения

Разработчики JetBrains добавили множество готовых функций-расширений для многих классов, в том числе и для строк. Найти их можно в файле String.kt (в студии дважды нажмите клавишу Shift и в поисковой строке наберите имя данного файла для просмотра исходника).

Некоторые примеры функций-расширений представлены ниже. На самом деле их больше, изучайте самостоятельно.

Пробежаться по строке

Строку можно рассматривать как массив символов.

 val cat = "Барсик" val character = cat[2] println(character) // выводит р 

Пробежаться по всей строке без использования индекса.

 val cat = "Барсик" for(char in cat)

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

 val cat = "Барсик" for (char in cat.indices)

Саму строку можно предварительно явно перевести в массив символов.

 for(char in cat.toCharArray())

Можно вызывать forEach.

 cat.forEach < char ->println(char) > 

Если вам нужен не только символ строки, но и его индекс, то вызываем forEachIndexed.

 cat.forEachIndexed println("Index $index Character $char")> // Результат Index 0 Character Б Index 1 Character а Index 2 Character р Index 3 Character с Index 4 Character и Index 5 Character к 

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

 val cat = "Барсик" val index = 5 println("Character at index $index in $cat is $") 

Если вы укажете несуществующий индекс, то получите исключение StringIndexOutOfBoundsException, поэтому делайте проверку.

Рассмотрим пример с числами. Допустим нужно произвести арифметические действия с целыми числами и вывести результат в строке.

 val a: Int = 9 val b: Int = 1 fun main(args: Array) < println("Осталось жизней: $") > 

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

Выведем второй элемент массива.

 fun main(args: Array) < val names = arrayListOf("Мурзик") names.add("Васька") names.add("Барсик") println("Кота зовут $") > 

Опять используем знак доллара и фигурные скобки.

Можно даже использовать условие.

 val count = 9 print("value of count is $") 

Многострочный текст можно создать, используя тройные кавычки. Больше нам не нужны символы перевода строки \n, а также символы типа \t, \b, \r и т.д.

 val multipleStringLines = """ У лукоморья дуб зелёный; Златая цепь на дубе том: И днём и ночью кот учёный Всё ходит по цепи кругом; Идёт направо - песнь заводит, Налево - сказку говорит. """ 

Метод trimMargin() позволяет убрать «пустые» символы из текста по разделителю | (по умолчанию):

 val myString = """This is the first line |This is the second line |This is the third line |And fourth line """ println(myString.trimMargin()) 

На выходе получим.

 This is the first line This is the second line This is the third line And fourth line 

Можно задать свой собственный разделитель и указать его в методе.

 trimMargin(">") 

Если первая и последняя строки длинного предложения пустые, то они будут удалены и строки.

Можем делать со строкой знакомые операции в удобной обёртке.

 val cat = "Барсик" println(cat.reversed()) // кисраБ println(cat.takeLast(2)) // ик val kitty /cdn-cgi/l/email-protection" data-cfemail="f29f8780889b99b2959f939b9edc919d9f">[email protected]" println(kitty.substringBefore("@")) // murzik 

Конвертируем строку в число

Сконвертировать строку в число можно через соответствующие методы.

 val str = "123" print(str.toLong()) 

Если нужно обработать ситуацию с null, то используйте другой метод.

 val str = "123.4" println(str.toLongOrNull()) // вернёт null 

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

 val str = "11111111" print(str.toLongOrNull(2)) //255 val str = "105" print(str.toLongOrNull(8)) //69 

Также есть схожие методы toShort(), toShortOrNull(), toInt(), toIntOrNull(), toFloat(), toDouble() и т.д. Часть из них поддерживает перегруженные версии с другой системой счисления, но проверяйте поддерживаемые системы.

Не совсем про числа, но можно сконвертировать в булево значение.

 val str = "false" println(str.toBoolean()) 

Дополняем строку символами

Можно дополнить строку символами с самого начала или в конце.

 val name = "Barsik" val pad = name.padStart(10, '#') println(pad) // ####Barsik val name = "Barsik" val pad = name.padEnd(10, '*') println(pad) // Barsik**** 

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

Подстроки

 // подстрока с указанного индекса val result = "developer.alexanderklimov.ru".substring(10) // alexanderklimov.ru // подстрока до первого указанного разделителя val first = "developer.alexanderklimov.ru".substringBefore('.') // developer // подстрока после первого указанного разделителя val last = "developer.alexanderklimov.ru".substringAfter('.') // alexanderklimov.ru // подстрока после последнего указанного разделителя val last = "developer.alexanderklimov.ru".substringAfterLast('.') // ru // подстрока до последнего указанного разделителя val beforeLast = "developer.alexanderklimov.ru".substringBeforeLast('.') // developer.alexanderklimov 

Ещё пример для получения адреса сайта без http://.

 val superSite = "http://developer.alexanderklimov.ru" val index = superSite.lastIndexOf('/') println("Индекс нужного нам символа: $index") println(superSite.substring(index + 1)) // developer.alexanderklimov.ru // другой вариант println(superSite.substringAfterLast("/")) 

Встроенные функции

Kotlin содержит множество встроенных удобных функций для работы со строками. Часть из них уже использовалась в примерах выше. Упомянем ещё несколько полезных функций.

 val blank = " ".isBlank() // true, если пустая строка или пустые символы пробела, табуляции и т.п. // индекс последнего символа val lastIndex = "Кот Мурзик".lastIndex // 9 // переводим в верхний регистр первый символ строки // decapitalize() выполняем обратную задачу val capitalize = "кот Мурзик".capitalize() val withSpaces = "1".padStart(2) // добавляем пробел перед строкой val endZeros = "1".padEnd(3, '0') // "100" добавляем нули в конец val dropStart = "Kotlin".drop(2) // "tlin" убираем первые символы в указанном количестве val dropEnd = "Kotlin".dropLast(3) // "Kot" убираем последние символы в указанном количестве // возвращаем строку без первого символа, который удовлетворяет условию val string = "Мурзик" val result = string.dropWhile < it == 'М' >textView.text = result // урзик // возвращаем строку без последнего символа, который удовлетворяет условию val string = "Мурзик" val result = string.dropLastWhile < it == 'к' >textView.text = result // Мурзи // разбиваем на массив строк "A\nB\nC".lines() // [A, B, C] "ABCD".zipWithNext() // [(A, B), (B, C), (C, D)] // удаляем символы из заданного диапазона val string = "Кот, который гулял сам по себе" val result = string.removeRange( 3..28 // range ) // Функции removeXXX() хороши для строк в виде ##Cat##, чтобы убрать лишние символы // удаляем префикс из строки val string = "Кот, который гулял сам по себе" val result = string.removePrefix("Кот") // удаляем суффикс из строки val string = "Кот, который гулял сам по себе" val result = string.removeSuffix("себе") // удаляем заданный разделитель, который должен окружать строку с начала и с конца val string = "та, тра-та-та, мы везём с собой кота" val result = string.removeSurrounding( "та" // delimiter ) textView.text = result // , тра-та-та, мы везём с собой ко // Также можно указать разные начало и конец, которые окружают строку val string = "Тра-та-та, тра-та-та, мы везём с собой кота" val result = string.removeSurrounding( "Тра-", // prefix " кота" // suffix ) textView.text = result // та-та, тра-та-та, мы везём с собой // Добавляем отступы при явном переводе на новую строку val string = "Какой-то длинный текст, \nсостоящий из имён котов: " + "\nВаська" + "\nБарсик" + "\nРыжик" val result = string.prependIndent( " " // indent ) // Разбиваем символы на две группы. // В первую группу попадут символы в верхнем регистре, во вторую - символы в нижнем регистре val string = "Кот Васька и кот Мурзик - Друзья!" val result: Pair = string.partition < it.isUpperCase() >textView.text = result.first + ":" + result.second //КВМД:от аська и кот урзик - рузья! // Разбиваем строку на список строк. В качестве разделителя - перевод на новую строку val string = "Кот Васька\nКотМурзик\nКот Мурзик" // Split string into lines (CRLF, LF or CR) val lines: List = string.lines() textView.text = "Кол-во строк: $" lines.forEach < textView.append("\n" + it) >// Разбиваем строку на список строк с указанным числом символов. В последней строке может выводиться остаток val string = "Тра-та-та, тра-та-та, мы везём с собой кота" val list:List = string.chunked(11) list.forEach < textView.append("$it\n") >/* Тра-та-та, тра-та-та, мы везём с собой кота */ // Содержит ли строка только цифры (используем предикат) val string = "09032020" // Returns true if all characters match the given predicate. val result: Boolean = string.all < it.isDigit() >textView.append("Is the string $string contain only digit? $result") // Содержит ли строка хотя бы одну цифру (используем предикат) val string = "3 кота" // Returns true if at least one character matches the given predicate. val result: Boolean = string.any() < it.isDigit() >textView.append("Is the text \"$string\" contain any digit? $result") // Сравниваем две строки с учётом регистра val string1 = "This is a sample string." val string2 = "This is a SAMPLE string." if (string1.compareTo(string2, ignoreCase = true) == 0) < textView.append("\n\nBoth strings are equal, ignoring case.") >else

Можно фильтровать данные с помощью filter(). Допустим, мы хотим извлечь только цифры из строки.

 val string = "9 жизней (2016) - Nine Lives - информация о фильме" val filteredText = string.filter < it.isDigit() >textView.text = filteredText // 92016 

Если хочется решить обратную задачу и получить только символы, но не цифры — то достаточно вызвать filterNot().

 val filteredText = string.filterNot

replace()/replaceRange()

Для замены отдельных символов или строк используется функция replace(). Заменим отдельные символы в строке.

 val string = "Кит Кишка" val result = string.replace( 'и', // old char 'о', // new char true // ignore case Boolean = false ) textView.text = result // Кот Кошка 

Можно менять подстроки.

 val result = string.replace( "Собака", // old value "Кот", // new value true // ignore case ) textView.text = result // Кот - друг человека 

Вариант replace() с регулярным выражением. Создадим функцию перевода строки на «драконий» язык. В результате будет создана новая строка с нужными символами.

 private fun toDragonSpeak(phrase: String) = phrase.replace(Regex("[aeiou]")) < when (it.value) < "a" ->"4" "e" -> "3" "i" -> "1" "o" -> "0" "u" -> "|_|" else -> it.value > > println(toDragonSpeak("Kitten")) // K1tt3n 

Можно заменять подстроки через replaceRange(), указывая нужный диапазон. Существуют две версии этого способа.

 val string = "Тра-та-та, тра-та-та, мы везём с собой ежа" // The end index of the range is included // in the part to be replaced. val result = string.replaceRange( 39..40, // range "кот" // replacement ) textView.append(result) val result2 = string.replaceRange( 39, // start index 41, // end index "кот" // replacement ) textView.append("\n") textView.append(result2) 

Конвертируем строку в дату

 import java.time.LocalDate var parsedDate = LocalDate.parse("2020-07-27") println(parsedDate) 

Есть также вариант с использованием DateTimeFormatter.

 import java.time.LocalDate import java.time.format.DateTimeFormatter var parsedDate = LocalDate.parse("Wednesday, July 27, 2020", DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy")) println("Wednesday, July 27, 2020 : " + parsedDate) parsedDate = LocalDate.parse("July 27, 2020", DateTimeFormatter.ofPattern("MMMM dd, yyyy")) println("July 27, 2020 : " + parsedDate) parsedDate = LocalDate.parse("14/02/2020", DateTimeFormatter.ofPattern("dd/MM/yyyy")) println("14/02/2020 : "+parsedDate) parsedDate = LocalDate.parse("27 July,2019", DateTimeFormatter.ofPattern("dd MMMM,yyyy")) println("27 July,2019 : " + parsedDate) parsedDate = LocalDate.parse("11th April,2012", DateTimeFormatter.ofPattern("dd'th' MMMM,yyyy")) println("11th April,2012 : " + parsedDate) parsedDate = LocalDate.parse("27 Feb, 2001", DateTimeFormatter.ofPattern("dd MMM, yyyy")) println("27 Feb, 2001 : " + parsedDate) 

StringBuilder

У класса StringBuilder в Kotlin есть отдельная функция buildString(), которая поможет сократить количество кода для получения строки.

 fun printAlphabet() = buildString

Вы не сможете решить эту задачу на собеседовании

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

Прежде всего — немного истории. Работая на должностях тимлида и техлида мне порой приходилось проводить собеседования, соответственно нужно подготовить несколько теоретических вопросов, ну и пару несложных задач, на решение которых не должно было бы уйти больше 2х-3х минут. Если с теорией все просто — мой любимый вопрос это: «чему равен typeof null?», по ответу сразу можно понять, кто сидит перед тобой, джун — просто правильно ответит, а претендент на сеньера, еще и объяснит почему. То с практикой — сложнее. Я долго не мог придумать нормальное задание, не изъезженное, типа fizz-buzz, а что-нибудь свое. Поэтому я на собеседованиях давал задания, которые сам проходил, устраиваясь на текущую работу. О первом из них и пойдет речь.

Текст задачи

Напишите функцию, которая принимает на вход строку, а возвращает эту строку «задом наперед»

function strReverse(str) <>; strReverse('Habr') === 'rbaH'; // true 

Очень простая задача, решений для которой масса, самым оптимальным для себя я долго считал такое решение:

const strReverse = str => str.split('').reverse().join('');

Но что-то меня в этом решении смущало всегда, а именно ненадежность «split(»)». И вот после одного из собеседований, я задумался: «Что же такое я могу передать в строке, что сломает мой способ. ». Ответ пришел очень быстро.

О, да, вы уже могли понять о чем я, emoji! Эти чертовы смайлики, их придумал сам дьявол, вы только посмотрите, во что превращается палец вверх, если его перевернуть (нет, не в палец вниз).

Сразу хочу извиниться, редактор разметки убирает emoji из кода, поэтому вставляю картинки.

image

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

image

Огонь, работает, супер, но… Подождите ка, с недавних пор мы можем указать цвет для смайла, и что же будет, если мы передадим такой emoji в функцию?

Это фиаско, братан!

image

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

Помог случай, ну или спортивный интерес. Со словами «Хочешь задачку со специальной олимпиады?» я отправил ее моему бывшему коллеге. «Ок, к вечеру попробую сделать» — последовал ответ, и я напрягся… «А что если сделает? А что если реально сможет? Он сможет, а я — нет? Так дела не пойдут!» — так подумал я и начал шерстить интернет.

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

Что нам нужно знать о Emoji?

Во первых, это — стандарт! Стандарт, который хорошо описан.

Решающим моментом в жизни emoji можно считать день принятия стандарта unicode 8.0 и стандарта emoji 2.0 в нем, тогда и были описаны первые последовательности юникода и последовательности emoji.

Давайте вот тут остановимся чуть подольше и разберем вопрос подробнее.

Согласно первой версии стандарта emoji является представлением одного символа юникода

image

Вторая версия стандарта позволяет нам взять несколько симовлов юникода в определенной последовательности, чтобы получить emoji

image

Это и есть простые последовательности в emoji, но простые они только потому что есть еще и zwj — последовательности.

ZERO WIDTH JOINER (ZWJ) — соединитель с нулевой шириной, это та ситуация, когда между несколькими emoji вставляется специальный символ юникода ZWJ (200D), который «схлопывает» emoji по обе стороны от него и вот что мы получаем в итоге:

image

В последующих стандартах эти последовательности только дополнялись, так что количество комбинаций emoji только росло со временем.

Что ж, с мат частью разобрались, но что же нам делать, чтобы перевернуть строку и при этом сохранить последовательность?

Регулярные выражения.

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

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

Последовательность может быть составлена по следующей формуле
emoji_sequence := emoji_core_sequence | emoji_zwj_sequence | emoji_tag_sequence # по пунктам emoji_core_sequence := emoji_character | emoji_presentation_sequence | emoji_keycap_sequence | emoji_modifier_sequence | emoji_flag_sequence emoji_presentation_sequence := emoji_character emoji_presentation_selector emoji_presentation_selector := \x emoji_keycap_sequence := [0-9#*] \x emoji_modifier_sequence := emoji_modifier_base emoji_modifier emoji_modifier_base := \p emoji_modifier := \p # к этому вернемся чуть позже emoji_flag_sequence := regional_indicator regional_indicator regional_indicator := \p emoji_zwj_sequence := emoji_zwj_element ( ZWJ emoji_zwj_element )+ emoji_zwj_element := emoji_character | emoji_presentation_sequence | emoji_modifier_sequence emoji_tag_sequence := tag_base tag_spec tag_term tag_base := emoji_character | emoji_modifier_sequence | emoji_presentation_sequence tag_spec := [\x-\x]+ tag_term := \x

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

Unicode Categories

В юникоде определены категории, используя которые мы можем в регулярных выражениях находить, например, все заглавные буквы, или, например, все буквы латинского алфавита. Более подробно со списком можно ознакомиться здесь. Что важно для нас: в стандарте определены категории для emoji: , , , , и казалось бы, все хорошо, давайте использовать, но в реализацию ECMAScript они еще не вошли. Точнее — вошла только одна категория —

image

Остальные на данный момент находятся на рассмотрении в tc-39 (stage-2 на момент 10.04.2019).

«Что ж, придется писать регулярку» — подумал и примерно через час мой бывший коллега кидает мне ссылку на гитхаб github.com/mathiasbynens/emoji-regex, ну да, на гитхабе всегда найдется то, что ты только собирался написать… А жаль, но речь не об этом… Библиотека реализует и импортирует регулярное выражение для поиска эмоджи, в принципе то что надо! Наконец то можно попробовать написать реализацию нужной нам функции!

 const emojiRegex = require('emoji-regex'); const regex = emojiRegex(); function stringReverse(string) < let match; const emojis = []; const separator = `unique_separator_$`; const reversedSeparator = [. separator].reverse().join(''); while (match = regex.exec(string)) < const emoji = match[0]; emojis.push(emoji); >return [. string.replace(regex, separator)].reverse().join('').replace(new RegExp(reversedSeparator, 'gm'), () => emojis.pop()); > 

image

Подводя небольшой итог

Я обожаю задачи со «специальной» олимпиады, они заставляют меня узнавать что-то новое, каждый раз расширяя границы знаний. Я не понимаю людей, которые говорят: «Я не понимаю, зачем нужно знать, что null >= 0? Мне это не пригодится!». Пригодится, 100% пригодится, в тот момент, когда ты будешь выяснять причину того-или иного явления — ты прокачаешь себя, как программиста и станешь лучше. Не лучше кого-то, а лучше себя, который еще пару часов назад не знал, как решить какую-то задачу.

Спасибо за прочтение, всем спасибо, буду рад любым комментариям.

Все сломала буква \u\u. Это буква ё, состоящая из 2х символов, оказывается в стандарте юникода есть вариант объединения не только emoji, но и просто символов… Но это — совсем другая история.

UPD: Речь идет не о букве «Ё», а о сочетании 2х символов Юникода u(Е) и u(«̈), которые идя друг за другом образуют последовательность юникода и мы видим букву «Ё» на экране.

  • javascript
  • задачи для собеседований
  • интересные задачи
  • emoji
  • unicode
  • Занимательные задачки
  • JavaScript

Как вывести строку в обратном порядке на Java? 4 способа реверса строки

Как вывести строку в обратном порядке на Java? 4 способа реверса строки

В этой короткой заметке мы рассмотрим несколько способов вывести строку в обратном порядке: напишем парочку своих «велосипедов» и посмотрим на возможности реверса строк, которые предоставляет Java из коробки.

Способы перевернуть строку в Java

В примерах ниже мы попробуем вывести строку в реверсном режиме разными способами, а именно: рекурсивно и с использованием методов charAt() , toCharArray() и StringBuffer() .

Рекурсивный метод

Первым делом давайте попробуем реализовать вывод строки в обратном порядке с помощью «велосипедной рекурсии» :).

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 ) ;

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

// пример работы рекурсивного способа
// вручную считаем для строки «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() и сохранение строки с обратным порядком символов. Смотрим на примере:

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() и затем в обратном порядке присваиваем символы результирующей строке. Смотрим пример:

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() :

String inputString = «java» ;
String reversedString = new StringBuffer ( inputString ) . reverse ( ) . toString ( ) ;

Вот так в две строчки кода мы избавились от необходимости писать отдельные методы для переворота строки — Java за нас делает всю работу. Интересно знать, что внутри метода reverse() происходит сложный процес создания новой перевернутой строки со множеством проверок и оптимизаций быстродействия, о которых мы не задумывались в наших тестовых программках.

Подробнее о работе со строками читайте здесь.

Используете ли вы какой-то из этих способов в своих проектах? Также пишите свои методы в комментариях!

Больше полезных статей!

5 thoughts to “Как вывести строку в обратном порядке на Java? 4 способа реверса строки”

Алексей :

В «велосипедной рекурсии» возвращает это: return reverseStringWithRecursion(rightPart) + reverseStringWithRecursion(leftPart); Тут точно никакой ошибки? если нет, то объясните, как вычислении возвращаемого значения может вызываться та же самая функция? Я в этом деле пока новичок…

Алексей :
Все, понял. Вопрос отпал
Heretic :

В общем случае вместо StringBuffer рекомендуется использовать StringBuilder, у него тоже есть метод reverse().

Способ «Переворачиваем строку с помощью charAt()» неправильно написан, строка будет в том же порядке
Надо поправить направление цикла, с конца.

Как развернуть строку в kotlin

Ключевые слова: реверс, строка наоборот, задом наперед, палиндром

Java

str2 = str.reverse()

Python

str2 = str[::-1]
str2 = ''.join(reversed(str))

C#

StringBuilder str2 = new StringBuilder(str.Length); 
for (int i = str.Length; i-- != 0; )
str2.Append(str[i]);
char[] arr = str.ToCharArray(); 
Array.Reverse(arr);
str2 = new String(arr);

JavaScript

str2 = str.split('').reverse().join('')

Pascal

for i:=length(str) downto 1 do 
str2 := str2 + str[i];

PHP

str2 = strrev(str)

1С:

Для сч = 1 По СтрДлина(стр) Цикл
стр2 = Сред(стр, сч, 1) + стр2;
КонецЦикла;

2) через буфер двоичных данных (для кодировки ANSI)

Данные="Мама мыла раму"; 
Буфер=ПолучитьБуферДвоичныхДанныхИзСтроки(Данные,КодировкаТекста.ANSI);
Буфер=Буфер.Перевернуть();
Данные=ПолучитьСтрокуИзБуфераДвоичныхДанных(Буфер,КодировкаТекста.ANSI);

или в одну строку:

стр2 = 
ПолучитьСтрокуИзБуфераДвоичныхДанных(ПолучитьБуферДвоичныхДанныхИзСтроки(стр,КодировкаТекста.ANSI).П
еревернуть(),КодировкаТекста.ANSI)

3) Рекурсия (при большой глубине приводит к вылету)

Функция Зеркало(ИсхСтрока,Знач х = 1) 
Возврат ?(х>СтрДлина(ИсхСтрока), "", Зеркало(ИсхСтрока,х+1) + Сред(ИсхСтрока,х,1));
КонецФункции
стр = "Мама мыла раму"; 
стр2 = "";

тз = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Буква", Новый ОписаниеТипов("Строка"));

Для н = 1 По СтрДлина(стр) Цикл
строкаТЗ = тз.Добавить();
строкаТЗ.Буква = Сред(стр, н, 1);
КонецЦикла;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст ;

Запрос.УстановитьПараметр("ТЗ", тз);
тз2 = Запрос.Выполнить().Выгрузить();

Для Каждого строкаТЗ ИЗ тз2 Цикл
стр2= стр2 + строкаТЗ.Буква;
КонецЦикла;

Сообщить(стр2);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *