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