库存不足提醒
本课属于 Coddy Kotlin 学习旅程的“逻辑与流程”单元。第 60 课,共 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。不存在的物品可用库存为零。出售零件不会创建不存在的物品。保留库存为零的已有物品。添加 REPORT:以 item=quantity 的格式回复所有已保存的条目,条目之间用 ; 分隔,并按物品名称的字母顺序排序。包含库存为零的条目。清单为空时回复 empty。REPORT 没有参数字段。添加 LOW|threshold:按照与数量相同的数字规则验证阈值。输入无效时回复 invalid。否则,回复库存严格低于阈值的已保存物品名称,按字母顺序排序,并用 ; 分隔;如果没有符合条件的物品,则回复 none。LOW 不会改变库存。本步骤的输入只使用支持的操作。
除非上文规定了更严格的范围,否则每一层集合最多包含 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")
}
}
"REPORT" -> {
if (stock.isEmpty()) replies.add("empty")
else replies.add(stock.keys.sorted().map { "$it=${stock[it]}" }.joinToString(";"))
}
}
}
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 在线编辑器