Можете ли вы отобразить / свести строку в Int?

Я решал проблему с кодами, в которых мне приходилось суммировать цифры большого числа (может иметь до 100 тыс. Цифр), и мне пришлось бы повторить этот процесс, пока не останется только одна цифра, и подсчитайте количество раз я это сделал, и я придумал рабочее решение, однако мне хотелось бы знать, можно ли сделать некоторые вещи в более «Kotlin-ish like way», поэтому дано:

fun main(args: Array<String>) { println(transform(readLine()!!)) } fun transform(n: String): Int { var count = 0 var sum : Int var s = n while(s.length > 1) { sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() } s = sum.toString() count++ } return count } 
  1. sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() } есть способ, по sum = (0 until s.length).sumBy { s[it].toInt() - '0'.toInt() } я догадываюсь отобразить сумму цифр в строке переменной суммы или в общем, лучший подход, чем тот, который я использовал?
  2. При преобразовании Char в Int он преобразует его в значение ASCII, поэтому мне пришлось добавить «-'0'.toInt ()», есть ли более быстрый способ (не то, что писать слишком сложно, спрашивая из любопытства)?
  3. Как сделать String n mutable без создания новой String s и манипулирования ею? Или это желаемый (и единственный) способ?

PS Я новичок с Котлином.

При преобразовании Char в Int он преобразует его в значение ASCII, поэтому мне пришлось добавить «-'0'.toInt ()», есть ли более быстрый способ (не то, что писать слишком сложно, спрашивая из любопытства)?

Вы можете просто написать s[it] - '0' , потому что вычитание Chars в Kotlin уже дает вам Int:

 public class Char ... { ... /** Subtracts the other Char value from this value resulting an Int. */ public operator fun minus(other: Char): Int ... } 

Но почему происходит цикл по индексам, когда вы можете напрямую перебирать Chars?

 sum = s.sumBy { it - '0' } 

Это функциональный (и рекурсивный) стиль для его решения:

 private fun sum(num: String, count: Int) : Int { return num //digit to int .map { "$it".toInt() } //sum digits .sum() //sum to string .toString() //if sum's length is more than one, do it again with incremented count. Otherwise, return the current count .let { if (it.length > 1) sum(it, count + 1) else count } } 

И вы называете это так:

 val number = "2937649827364918308623946..." //and so on val count = sum(number, 0) 

Надеюсь, поможет!

Intereting Posts
Класс не найден в котлин? Вызов прослушивателя в ViewHolder только иногда отвечает SetOnClickListener в ViewHolder в адаптере Kotlin Не удалось запустить файл jar. (Ошибка: не удалось найти или загрузить основной класс co.pissarra.Mainkt) Почему проверка ссылочного равенства возвращает true, когда ссылка различна Преобразовать код RxJava в Kotlin правильно Сравните класс данных в Kotlin без ID Как получить Flowable <List <Foo >> из объекта «Bar» с отношениями «один ко многим» «Foo» с использованием realm и Rxjava Firebase Admin SDK не может подключаться к базе данных из внутреннего файла jar Котлин: когда и как следует использовать выражения лямбда Горизонтальный LinearLayout в Анко Vert.x Kotlin Тип Несоответствие требуется Обработчик <AsyncResult <Unit >> found (Обработчик <AsyncResult <Unit >>) -> Unit Растровые изображения Android EffectFactory Невозможно создать привязки вида java.lang.NullPointerException Тип-Безопасность с необязательными полями в классе данных для JSON