HUAWEI 机试题:运维日志排序
🌈 Scala 实现
题目描述:
-
运维工程师采集到某产品线网运行一天产生的日志n条,现需根据日志时间先后顺序对日志进行排序,日志时间格式为H:M:S.N。
-
H表示小时(0~23)
-
M表示分钟(0~59)
-
S表示秒(0~59)
-
N表示毫秒(0~999)
-
-
时间可能并没有补全,也就是说,01:01:01.001也可能表示为1:1:1.1。
输入描述:
- 第一行输入一个整数n表示日志条数,1<=n<=100000,接下来n行输入n个时间。
输出描述:
- 按时间升序排序之后的时间,如果有两个时间表示的时间相同,则保持输入顺序。
示例:
输入:
- 2
- 01:41:8.9
- 1:1:09.211
输出:
- 1:1:09.211
- 01:41:8.9
输入:
- 3
- 23:41:08.023
- 1:1:09.211
- 08:01:22.0
输出:
- 1:1:09.211
- 08:01:22.0
- 23:41:08.023
输入:
2
22:41:08.023
22:41:08.23
输出:
22:41:08.023
22:41:08.23
代码:
def main(args: Array[String]): Unit = {
val scan = new Scanner(System.in)
// 获取输入日志条数
val count = scan.nextLine().toInt
// 存放日志
var logs = ListBuffer[Tuple3[Integer, String, Integer]]()
// 获取输入的日志
for (i <- 1 to count) {
var str = scan.nextLine()
logs.append(Tuple3(i, str, getMillisecond(str)))
}
// 实现排序
logs
.sortWith((o1, o2) => {
if (!o1._3.equals(o2._3)) {
o1._3.compareTo(o2._3) < 0 // 按时间升序排序之后的时间
} else {
o1._1.compareTo(o2._1) < 0 // 如果有两个时间表示的时间相同,则保持输入顺序
}
})
.foreach(log => println(log._2)) // 输出排序后的结果
}
def getMillisecond(str: String): Int = {
val time = str.split(":")
val hour = time(0).toInt * 60 * 60 * 1000
val minute = time(1).toInt * 60 * 1000
val second = time(2).split("\\.")(0).toInt * 1000
val millisecond = time(2).split("\\.")(1).toInt
hour + minute + second + millisecond
}
❤️ END ❤️
版权声明:本文为weixin_47243236原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。