Menu
CoddyTech

库存报告

本课属于 Coddy Kotlin 学习旅程的“逻辑与流程”单元。第 59 课,共 63 课。

challenge icon

挑战

困难

完成 runInventory,参数为 commands: List<String>。每次调用函数时,都创建一个初始为空的库存。每条命令都是一个字符串,字段之间用 | 分隔。物品名称是小写 ASCII 单词。命令最多有 100 条。按字面分隔符拆分每条命令;每条命令的字段数量始终符合其操作的要求。每条命令返回一条回复。解析前先去除数量两端的空白;有效数量介于 0 和 1000 之间。无效数字文本、超出 Int 范围的文本、负数数量或大于 1000 的数量都会产生 invalid,且不改变状态。保留你在前面步骤中编写的所有内容,包括之前的每条命令和回复。支持 ADD|item|quantity:将有效数量加到该物品的库存中,物品的初始库存为零,并回复 added。添加零也会创建该物品。添加 GET|item:以字符串形式回复该物品的数量;如果该物品不存在,则回复 0。添加 SELL|item|quantity:先按照与 ADD 相同的规则验证数量。数量有效时,如果可用库存较少,则回复 insufficient;否则,扣除相应数量并回复 sold。不存在的物品可用库存为零。出售零件不会创建不存在的物品。保留库存为零的现有物品。添加 REPORT:回复所有已保存的条目,格式为 item=quantity,条目之间用 ; 分隔,并按物品名称的字母顺序排序。包含库存为零的条目。库存为空时回复 empty。REPORT 不包含参数字段。输入只使用此步骤支持的操作。

除非上文规定了更严格的范围,否则每一层集合最多包含 100 个元素;整数参数和整数集合值的范围为 -1000 到 1000。用于解析的文本可能包含无效或超出范围的表示形式,如上所述。

返回 List<String> 类型的值。保留提供的输入/输出代码。它逐行读取标量参数;列表以元素数量开头,后跟各个元素;映射以条目数量开头,后跟每个键和值。嵌套列表的每一行都重复数量和元素的格式。提供的 main 会打印返回值,后跟一个换行符。列表使用 Kotlin 的标准方括号格式;不要打印额外标签。

亲手试试

fun runInventory(commands: List<String>): List<String> {
    val stock = mutableMapOf<String, Int>()
    val replies = mutableListOf<String>()
    for (command in commands) {
        val parts = command.split("|")
        val operation = parts[0]
        val item = if (parts.size > 1) parts[1] else ""
        when (operation) {
            "ADD" -> {
                val amount = parts[2].trim().toIntOrNull()
                if (amount == null || amount !in 0..1000) replies.add("invalid")
                else {
                    stock[item] = (stock[item] ?: 0) + amount
                    replies.add("added")
                }
            }
            "GET" -> replies.add((stock[item] ?: 0).toString())
            "SELL" -> {
                val amount = parts[2].trim().toIntOrNull()
                val available = stock[item] ?: 0
                if (amount == null || amount !in 0..1000) replies.add("invalid")
                else if (amount > available) replies.add("insufficient")
                else {
                    if (stock.containsKey(item)) stock[item] = available - amount
                    replies.add("sold")
                }
            }
        }
    }
    return replies
}
fun main() {
    val commandsCount = readln().toInt()
    val commands = mutableListOf<String>()
    for (i0 in 0 until commandsCount) {
        val commandsItem = readLine().orEmpty()
        commands.add(commandsItem)
    }
    println(runInventory(commands))
}

逻辑与流程中的所有课

自己练习: Kotlin 在线编辑器