联系人统计
本课属于 Coddy Kotlin 学习旅程的“逻辑与流程”单元。第 25 课,共 63 课。
挑战
困难完成 contactBook,它的参数为 commands: List<String>、names: List<String>、phones: List<String>。构建一个内存中的通讯录,每次调用函数时都从空状态开始。三个列表长度相等,最多为 100。在每个索引处,commands 选择一个操作,names 和 phones 提供该操作的参数。名称是非空的小写 ASCII 单词;电话号码是非空的数字字符串,必须保留为字符串,以保留前导零。每条命令都会在返回的列表中生成一条回复。保留你在前面步骤中编写的所有内容,包括之前的所有命令和回复。支持 PUT:保存或替换给定名称对应的电话号码,然后回复 saved。添加 FIND:回复给定名称对应的已保存电话号码;如果没有,则回复 missing。它的电话号码参数会被忽略。添加 REMOVE:移除给定名称;如果该名称存在,则回复 removed,否则回复 missing。它的电话号码参数会被忽略。添加 LIST:按 Kotlin 的标准方括号格式回复已保存名称的排序列表,例如 [ada, bo];如果为空,则回复 []。两个参数值都会被忽略。使用 contacts.keys.sorted().toString() 创建这条回复字符串。添加 COUNT:回复 contacts=N;phones=P,其中 N 替换为已保存名称的数量,P 替换为不同已保存电话号码字符串的数量。两个参数都会被忽略。两个名称可以共用一个电话号码。输入只包含本步骤支持的命令。被忽略的参数字符串可以是任意非空文本。
除非上文规定了更严格的边界,否则每一层的集合最多包含 100 个元素,整数参数和集合中的整数值都在 -1000 到 1000 之间。需要解析的文本可能包含无效或超出范围的表示形式,具体如上所述。
返回一个 List<String> 类型的值。保留提供的输入/输出代码。它每行读取一个标量参数;列表以元素数量开头,后跟各个元素;映射以条目数量开头,后跟每个键和值。嵌套列表的每一行都重复数量和元素的格式。提供的 main 会打印返回值,后跟一个换行符。列表使用 Kotlin 的标准方括号格式;不要打印额外标签。
亲手试试
fun contactBook(commands: List<String>, names: List<String>, phones: List<String>): List<String> {
val contacts = mutableMapOf<String, String>()
val replies = mutableListOf<String>()
for (i in commands.indices) {
val name = names[i]
when (commands[i]) {
"PUT" -> {
contacts[name] = phones[i]
replies.add("saved")
}
"FIND" -> replies.add(contacts[name] ?: "missing")
"REMOVE" -> {
if (contacts.containsKey(name)) {
contacts.remove(name)
replies.add("removed")
} else replies.add("missing")
}
"LIST" -> replies.add(contacts.keys.sorted().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)
}
val namesCount = readln().toInt()
val names = mutableListOf<String>()
for (i0 in 0 until namesCount) {
val namesItem = readLine().orEmpty()
names.add(namesItem)
}
val phonesCount = readln().toInt()
val phones = mutableListOf<String>()
for (i0 in 0 until phonesCount) {
val phonesItem = readLine().orEmpty()
phones.add(phonesItem)
}
println(contactBook(commands, names, phones))
}逻辑与流程中的所有课
自己练习: Kotlin 在线编辑器