#string #kotlin #stringbuilder
#строка #kotlin #stringbuilder
Вопрос:
Строка в Kotlin неизменяема, не может работать как
ans[index] = value
Интересно, это простой способ заставить его работать
Комментарии:
1. Поскольку строка неизменяема (как вы знаете), вы не можете изменить значение строки. Я не уверен, о чем вы здесь спрашиваете.
2. на другом языке, например, cpp, он изменяемый, и для быстрого решения проблемы с алгоритмом мне нужно решение
3.Чего именно вы пытаетесь достичь? Если вы хотите иметь строку, которая отличается от входной строки символом
replaceRange
, это ваш лучший выбор: kotlinlang.org/api/latest/jvm/stdlib/kotlin.text /…ans = ans.replaceRange(index, index 1, value)
Ответ №1:
Если вы решили использовать StringBuilder, вы также можете использовать .insert()
и создать что-то вроде этого:
fun String.addCharAtIndex(char: Char, index: Int) =
StringBuilder(this).apply { insert(index, char) }.toString()
Его вызов будет работать следующим образом:
val s = "hello orld".addCharAtIndex('w', 6)
println(s) // this will print 'hello world'
Дело в том, что мы не добавляли к существующей строке, мы создали новую, а старую оставили для GC. Это будет означать, что если бы исходная строка имела 1 МБ, мы бы теперь использовали 2 МБ (пока GC не выполнит свою работу). Если строка небольшая и у нас достаточно памяти, этот код должен быть в порядке.
Я не уверен, как можно было бы на самом деле добавить к строке, не создавая новую, поскольку строка неизменяема в Kotlin.
Редактировать:
По-видимому, как предположил @al3c, уже есть функция, которая делает это вызывается replaceRange()
, которая будет работать для любого CharSequence
. Вероятно, он будет работать лучше, чем пользовательский, который я показал выше (при желании он также будет работать для добавления a CharSequence
, а не только a Char
).
Вы бы использовали его следующим образом:
val string = "hello orld".replaceRange(6,6,"w")
println(string) //this will print 'hello world'
Но просто к сведению, это также создаст новый String
. Смотрите в документации:
Возвращает последовательность символов с содержимым этой последовательности символов, где ее часть в заданном диапазоне заменяется заменяющей последовательностью символов.
Ответ №2:
Если вы хотите вносить частые изменения, вы можете преобразовать его в CharArray
first , внести изменения, а затем joinToString
.
val index = 3
val str = "one two"
val ans = str.toCharArray().also { it[index] = '_' }.joinToString("")
print(ans)
Хотя, если это только однократное изменение, было бы лучше использовать StringBuilder
, как предлагали другие.