Intereting Posts
Gradle 3.0.0 (в Android Studio 3.0) изменяет порядок последовательности задач (при компиляции с модулем Kotlin)? Ссылки на общие функции Смыкая функцию расширения в Котлине Почему Котлин не требует попыток и уловки явно Как добавить репозиторий maven по URL-адресу, используя kotlinscript DSL (build.gradle.kts) Динамически создавать элементы управления в android с помощью Kotlin Что означает предупреждение «Использовать свойства из пакетов вариантов сборки»? В чем разница между фигурными фигурными скобками и нормальными скобками в RxJava с Kotlin Что такое эквивалент Котлина для поразрядного или с присвоением '| ='? Производит ли вызов Kotlin метод вызова метода Какова цель Декларации объекта внутри герметичного класса в Котлине? Когда экземпляр Kotlin (объявленный с помощью модификатора объекта) создается? Обработчик для запуска задачи каждые 5 секунд. Котлин Статические методы и переменные Котлина Kotlin установлен в Null If Not Null

Kotlin: как поменять символ в String

Я хотел бы поменять строку с «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] 

Он выдает ошибку, как указано выше. Что я сделал не так? Как я могу исправить это и получить то, что хочу?

Solutions Collecting From Web of "Kotlin: как поменять символ в String"

Строки в Котлине, как и в 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) 

Что касается вашего кода, 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 :

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

Применение:

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

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

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

Упрощенное решение: просто используйте toMutableList (), чтобы создать MutableList Char, а затем присоедините его вместе с joinToString.

Пример:

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

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