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 ответов


строки в Котлин так же, как в Java неизменяемы, поэтому нет string.set(index, value) (что и есть string[index] = value эквивалентно).

чтобы построить строку из частей, вы можете использовать StringBuilder создать CharSequence и использовать joinToString, работать с простым массивом (char[]) или result = result + nextCharacter (создает новую строку каждый раз-это самый дорогой способ).

вот как вы могли бы сделать это с StringBuilder:

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()

однако, гораздо проще способ достижения вашей цели ("bcdea" от "abcde") - это просто" переместить " один символ:

var result = prevResult.substring(1) + prevResult[0]

или с помощью Sequence методы:

var result = prevResult.drop(1) + prevResult.take(1)

можно использовать drop(1) и first() (или take(1)) сделать это в одной строке:

val str = "abcde"
val r1 = str.drop(1) + str.first()
val r2 = str.drop(1) + str.take(1)

что касается вашего кода, Котлин String является неизменяемым, и вы не можете изменить его символы. Чтобы достичь того, что вы хотите, вы можете преобразовать a String to 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:

fun String.rotate(n: Int) = drop(n % length) + take(n % length)

использование:

val str = "abcde"
val r1 = str.rotate(1)

более простое решение: просто используйте toMutableList () для создания Мутабелиста Char, а затем объедините его вместе с joinToString.

пример:

учитывая строковый ввод, мы хотим обмениваться символами в позициях posA и posB:

val chars = input.toMutableList()
val temp = chars[posA]
chars[posA] = chars[posB]
chars[posB] = temp
return chars.joinToString(separator = "")

поскольку строки неизменяемы, вам придется скопировать исходную строку в массив, внести изменения в массив, а затем создать новую строку из измененного массива. Погляд:

  • getChars () чтобы скопировать символы строки в массив.
  • выполните свой алгоритм на этом массиве, внося изменения в него по мере необходимости.
  • преобразовать измененный массив обратно в строку с строки(char[]).