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[]).