Kotlin - Литерал символа не соответствует ожидаемому типу Int - PullRequest
1 голос
/ 18 июня 2020

Я борюсь с типами в моей программе, меня сначала попросили сделать это в JS, и он работал нормально, но теперь я не могу добиться результата. Как вы думаете, мне следует разработать еще один «алгоритм»? Заранее благодарим за уделенное время.

fun main(){
    // the idea is to put numbers in a box
    // that cant be larger than 10
    val data = "12493419133"
    var result = data[0]
    var currentBox = Character.getNumericValue(data[0])
    var i = 1

    while(i < data.length){

        val currentArticle =  Character.getNumericValue(data[i])
         currentBox += currentArticle

        println(currentBox)

        if(currentBox <= 10){
            result += Character.getNumericValue(currentArticle)
        }else{
            result += '/'
            //var resultChar = result.toChar()
            // result += '/'
            currentBox = Character.getNumericValue(currentArticle)
            result += currentArticle
        }
        i++
    }
    print(result) //should print 124/9/341/91/33
}

Ответы [ 2 ]

4 голосов
/ 18 июня 2020

Результат фактически имеет тип Char, а функция оператора перегрузки + принимает только Int для увеличения значения ASCII для получения нового Char.

public operator fun plus(other: Int): Char

In idomati c Kotlin Кстати, вы можете решить свою проблему:

fun main() {
    val data = "12493419133"

    var counter = 0
    val result = data.asSequence()
        .map(Character::getNumericValue)
        .map { c ->
            counter += c
            if (counter <= 10) c.toString() else "/$c".also{ counter = c }
        }
        .joinToString("")  // terminal operation, will trigger the map functions

    println(result)
}

Изменить: Если data слишком велик, вы можете использовать StringBuilder, потому что он не создает строку каждый раз время повторения символа, и вместо использования собственного счетчика вы можете использовать list.fold()

fun main() {
    val data = "12493419133"

    val sb = StringBuilder()
    data.fold(0) { acc, c ->
        val num = Character.getNumericValue(c)
        val count = num + acc
        val ret = if (count > 10) num.also { sb.append('/') } else count
        ret.also { sb.append(c) }  // `ret` returned to ^fold, next time will be passed as acc
    }

    println(sb.toString())
}
2 голосов
/ 18 июня 2020

Если вы хотите получить результат в формате List<Char>, введите:

val data = "12493419133"
val result = mutableListOf<Char>()
var sum = 0
data.asSequence().forEach {
    val v = Character.getNumericValue(it)
    sum += v
    if (sum > 10) {
        result.add('/')
        sum = v
    }
    result.add(it)
}
println(result.joinToString(""))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...