Вставить символ в строку в определенной позиции x в Kotlin

#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 , как предлагали другие.