Kotlin:如何在String中交换字符

时间:2016-03-28 09:47:47

标签: kotlin

我想将一个字符串从“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]

如上所述评论行错误。我做错了什么?我怎么能解决这个问题并得到我想要的东西?

4 个答案:

答案 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)

由于字符串是不可变的,因此您必须将源字符串复制到数组中,对数组进行更改,然后从修改后的数组中创建新字符串。请看:

  • getChars()将字符串字符复制到数组中。
  • 在该阵列上执行算法,根据需要对其进行更改。
  • 将修改后的数组转换回String(char[])的字符串。