Loading

考研机试 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,消耗时间小数点后有三位数字。
计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开,行首和行尾可能有多余的空格。

输出描述

排序好的日志记录。每个记录的字符串各占一行。
输入的格式与输入保持一致,输入包括几个空格,你的输出中也应该包含同样多的空格。

题目链接

https://www.nowcoder.com/practice/0f64518fea254c0187ccf0ea05019672?tpId=40&tqId=21363&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

 

二.算法

题解

该题是一个多排序的问题。使用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);
        }
    }
}

 

posted @ 2021-03-06 14:16    阅读(78)  评论(0编辑  收藏  举报