销售商品
本课属于 Coddy Kotlin 学习旅程的“逻辑与流程”单元。第 58 课,共 63 课。
挑战
困难完成 runInventory,其参数为 commands: List<String>。构建一个每次函数调用时都从空状态开始的库存。每条命令都是一个字符串,字段之间用 | 分隔。物品名称是小写 ASCII 单词。命令最多有 100 条。按字面分隔符拆分每条命令;每种操作的命令字段数始终正确。每条命令返回一条回复。解析前先去除数量两侧的空白;有效数量范围为 0 到 1000。无效数字文本、超出 Int 范围的文本、负数或大于 1000 的数量都会产生 invalid,且不改变状态。保留你在前面步骤中编写的所有内容,包括之前的每条命令和回复。支持 ADD|item|quantity:将有效数量加入该物品的库存,该物品的初始库存为零,并回复 added。添加零仍会创建该物品。添加 GET|item:以字符串形式回复该物品的数量;如果物品不存在,则回复 0。添加 SELL|item|quantity:先按照与 ADD 相同的规则验证数量。对于有效数量,如果可用库存较少,则回复 insufficient;否则扣除该数量并回复 sold。不存在的物品可用库存为零。出售零会成功,但不会创建不存在的物品。保留库存为零的现有物品。此步骤的输入只使用已支持的操作。
除非上文规定了更严格的限制,否则每一层集合最多包含 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())
}
}
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 在线编辑器