日志聚合器
本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 55 课,共 56 课。
挑战
中等你正在处理访问日志。读取一行输入:一个以逗号分隔的 level:user:bytes 条目列表。
有些条目无效,应该跳过:任何无法将 bytes 解析为整数的条目,或者 level 不是 INFO、WARN、ERROR 之一的条目(区分大小写)。
按以下顺序输出:
- 每个至少出现一次的级别输出一行,并按以下固定顺序排列:
ERROR、WARN、INFO。每行的格式为<level>: <count> (<bytes>),其中count是该级别的有效条目数,bytes是这些条目的字节数总和。 Top user: <name> (<bytes>):输出所有有效条目中总字节数最多的用户。若总字节数相同,则按姓名的字母顺序排列。Skipped: <n>,其中包含格式错误的条目数。
对于输入 INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75,输出为:
ERROR: 1 (50)
INFO: 3 (375)
Top user: alice (225)
Skipped: 2亲手试试
let entries = readLine()!.components(separatedBy: ",")
let order = ["ERROR", "WARN", "INFO"]
let validLevels: Set<String> = ["INFO", "WARN", "ERROR"]
// TODO:解析每条记录,丢弃无效记录,分别按级别和用户累计;
// 按固定顺序输出出现过的级别,再输出排名第一的用户,最后输出 Skipped 的数量
逻辑与流程中的所有课
自己练习: Swift 在线编辑器