zoukankan      html  css  js  c++  java
  • 考研机试 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);
            }
        }
    }
  • 相关阅读:
    OC ----关于时间的处理
    OC-- 判断字符串是否是纯数字
    OC 判断字符串是否只存在只有空格
    将Json字符串转换为数组
    调用接口时对参数的排序、生成签名、生成随机数,获取唯一标示符
    关于UIAlertView弹出警告框自动消失
    AVAudioPlayer 获取语音的长度(时间)
    AFN 请求 https get
    TableView  — reloadData     刷新
    mapView 地图视图
  • 原文地址:https://www.cnblogs.com/machi12/p/14490515.html
Copyright © 2011-2022 走看看