我想将一个字符串从“abcde”交换到“bcdea”。所以我在Kotlin中编写了如下代码
var prevResult = "abcde"
var tmp = prevResult[0]
for (i in 0..prevResult.length - 2) {
prevResult[i] = prevResult[i+1] // Error on preveResult[i]
}
prevResult[prevResult.length-1] = tmp // Error on preveResult[prevResult.lengt-1]
如上所述评论行错误。我做错了什么?我怎么能解决这个问题并得到我想要的东西?
答案 0 :(得分:7)
Strings in Kotlin就像在Java中一样是不可变的,因此没有string.set(index, value)
(string[index] = value
等同于它。)
要从可以使用StringBuilder
的片段构建字符串,构造CharSequence
并使用joinToString
,对普通数组(char[]
)进行操作或执行{{ 1}}(每次都创建一个新的String - 这是最昂贵的方式)。
以下是使用result = result + nextCharacter
:
StringBuilder
然而,实现目标的更简单方法(“abcde”中的“bcdea”)只是“移动”一个角色:
var prevResult = "abcde"
var tmp = prevResult[0]
var builder = StringBuilder()
for (i in 0..prevResult.length - 2) {
builder.append(prevResult[i+1])
}
builder.append(tmp) // Don't really need tmp, use prevResult[0] instead.
var result = builder.toString()
或使用var result = prevResult.substring(1) + prevResult[0]
方法:
Sequence
答案 1 :(得分:5)
您可以使用drop(1)
和first()
(或take(1)
)在一行中执行此操作:
val str = "abcde"
val r1 = str.drop(1) + str.first()
val r2 = str.drop(1) + str.take(1)
至于你的代码,Kotlin String
是不可变的,你不能修改它的字符。要实现您的目标,您可以将String
转换为CharArray
,对其进行修改,然后再生成String
:
val r1 = str.toCharArray().let {
for (i in 0..it.lastIndex - 1)
it[i] = it[i+1]
it[it.lastIndex] = str[0] // str is unchanged
String(it)
}
(let
用于简明以避免创建更多变量)
此外,您可以将此操作的更一般版本编写为String
的{{3}}:
fun String.rotate(n: Int) = drop(n % length) + take(n % length)
用法:
val str = "abcde"
val r1 = str.rotate(1)
答案 2 :(得分:2)
更简单的解决方案:只需使用toMutableList()创建Char的MutableList,然后将其与joinToString一起连接。
示例:
给定一个String输入,我们想要在posA和posB位置交换字符:
val chars = input.toMutableList()
val temp = chars[posA]
chars[posA] = chars[posB]
chars[posB] = temp
return chars.joinToString(separator = "")
答案 3 :(得分:0)
由于字符串是不可变的,因此您必须将源字符串复制到数组中,对数组进行更改,然后从修改后的数组中创建新字符串。请看: