考研机试 32.日志排序
时间:2021/03/06
一.题目描述
有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录: “hs_10000_p”是计算任务的名称, “2007-01-17 19:22:53,315”是计算任务开始执行的时间“年-月-日 时:分:秒,毫秒”, “253.035(s)”是计算任务消耗的时间(以秒计) hs_10000_p 2007-01-17 19:22:53,315 253.035(s) 请你写一个程序,对日志中记录计算任务进行排序。 时间消耗少的计算任务排在前面,时间消耗多的计算任务排在后面。 如果两个计算任务消耗的时间相同,则将开始执行时间早的计算任务排在前面。
输入描述
日志中每个记录是一个字符串,每个字符串占一行。最后一行为空行,表示日志结束。日志中最多可能有10000条记录。 计算任务名称的长度不超过10,开始执行时间的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗时间小数点后有三位数字。 计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开,行首和行尾可能有多余的空格。
输出描述
排序好的日志记录。每个记录的字符串各占一行。 输入的格式与输入保持一致,输入包括几个空格,你的输出中也应该包含同样多的空格。
题目链接
二.算法
题解
该题是一个多排序的问题。使用hasNext方法可以避免读入空行。运用正则表达式对输入进行分割,通过Collections的静态方法sort对列表进行排序。
重点
Collections的sort方法详解:https://www.cnblogs.com/machi12/p/14490475.html
正则表达式:\s匹配任何的空白字符,所以\s+可以匹配任何的空白字符串。
代码
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Main{ public static void main(String[] args){ //定义列表 Scanner in = new Scanner(System.in); ArrayList<String> list = new ArrayList<>(); //读取输入 while(in.hasNextLine()){ list.add(in.nextLine().trim()); } //进行排序,定义排序规则 Collections.sort(list, new Comparator<String>(){ public int compare(String s1, String s2){ String[] str1 = s1.split("\\s+"); String[] str2 = s2.split("\\s+"); //由于时间的长度不一致,所以不能直接比较字符串 double time1 = Double.parseDouble(str1[3].substring(0, str1[3].length() - 3)); double time2 = Double.parseDouble(str2[3].substring(0, str2[3].length() - 3)); if(time1 > time2){ return 1; }else if(time1 < time2){ return -1; } else{ if(!str1[1].equals(str2[1])){ return str1[1].compareTo(str2[1]); } else{ return str1[2].compareTo(str2[2]); } } } }); //输出排序结果 for(String item : list){ System.out.println(item); } } }
努力,向上,自律