在 Kotlin 中将字符插入字符串中的特定位置 x

UmA*_*orn 12 string stringbuilder kotlin

Kotlin 中的字符串是不可变的,不能像

ans[index] = value
Run Code Online (Sandbox Code Playgroud)

我想知道它们是使其发挥作用的简单方法

Ale*_*exT 21

如果您决定使用 StringBuilder,则还可以使用.insert(), 并创建如下内容:

fun String.addCharAtIndex(char: Char, index: Int) =
    StringBuilder(this).apply { insert(index, char) }.toString()
Run Code Online (Sandbox Code Playgroud)

调用它会像这样工作:

val s = "hello orld".addCharAtIndex('w', 6)
println(s) // this will print 'hello world'
Run Code Online (Sandbox Code Playgroud)

问题是,我们没有添加到现有字符串,而是创建了一个新字符串,并将旧字符串留给 GC。这意味着如果原始字符串有 1MB,我们现在将使用 2MB(直到 GC 完成它的工作)。如果字符串不是很大并且我们有足够的内存,那么这段代码应该没问题。

我不确定如何在不创建新字符串的情况下实际添加到字符串中,因为字符串在 Kotlin 中是不可变的。

编辑:

显然,正如 @al3c 所建议的,已经有一个函数可以执行此操作,replaceRange()该函数适用于任何CharSequence. 它可能会比我上面展示的自定义更好(如果需要的话,它也可以添加 a ,CharSequence而不仅仅是 a Char)。

你可以像这样使用它:

val string = "hello orld".replaceRange(6,6,"w")
println(string) //this will print 'hello world'
Run Code Online (Sandbox Code Playgroud)

但请注意,这也会创建一个新的String. 从文档中看到:

返回一个字符序列,其中包含此字符序列的内容,其中给定范围内的部分被替换字符序列替换。