1130.日志排序

Posted bernieloveslife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1130.日志排序相关的知识,希望对你有一定的参考价值。

题目描述:

有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:
“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,消耗时间小数点后有三位数字。
计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开,行首和行尾可能有多余的空格。

输出:

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

样例输入:
hs_10000_p   2007-01-17 19:22:53,315     253.035(s)
hs_10001_p   2007-01-17 19:22:53,315     253.846(s)
hs_10002_m   2007-01-17 19:22:53,315     129.574(s)
hs_10002_p   2007-01-17 19:22:53,315     262.531(s)
hs_10003_m   2007-01-17 19:22:53,318     126.622(s)
hs_10003_p   2007-01-17 19:22:53,318     136.962(s)
hs_10005_m   2007-01-17 19:22:53,318     130.487(s)
hs_10005_p   2007-01-17 19:22:53,318     253.035(s)
hs_10006_m   2007-01-17 19:22:53,318     248.548(s)
hs_10006_p   2007-01-17 19:25:23,367    3146.827(s)
样例输出:
hs_10003_m   2007-01-17 19:22:53,318     126.622(s)
hs_10002_m   2007-01-17 19:22:53,315     129.574(s)
hs_10005_m   2007-01-17 19:22:53,318     130.487(s)
hs_10003_p   2007-01-17 19:22:53,318     136.962(s)
hs_10006_m   2007-01-17 19:22:53,318     248.548(s)
hs_10000_p   2007-01-17 19:22:53,315     253.035(s)
hs_10005_p   2007-01-17 19:22:53,318     253.035(s)
hs_10001_p   2007-01-17 19:22:53,315     253.846(s)
hs_10002_p   2007-01-17 19:22:53,315     262.531(s)
hs_10006_p   2007-01-17 19:25:23,367    3146.827(s)


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct diary{
    string input;
    string name;
    string data;
    string time;
};

diary a[10001];

bool compare(diary n,diary m){
    if(n.time.size()!=m.time.size()) return n.time.size()<m.time.size();
    else {
         if(n.time!=m.time) return n.time<m.time;
         else return n.data<m.data;
    }
}

int main(){
    int i=0;
    while(getline(cin,a[i].input) && a[i].input!=" "){
        /*提取name*/
        int j,pos1,pos2;
        int len=a[i].input.size();
        for(j=0;j<len;j++){
            if(a[i].input[j]!= ) {
                pos1=j;
                break;
            }
        }
        for(j=pos1;j<len;j++){
            if(a[i].input[j]== ){
                pos2=j;
                break;
            }
        }
        a[i].name=a[i].input.substr(pos1,pos2-pos1);
        /*提取start*/
        int pos3,pos4,pos5;
        for(j=pos2;j<len;j++){
            if(a[i].input[j]!= ){
                pos3=j;
                break;
            }
        } 
        for(j=pos3;j<len;j++){
            if(a[i].input[j]== ){
                pos4=j;
                break;
            }
        }
        for(j=pos4+1;j<len;j++){
            if(a[i].input[j]== ){
                pos5=j;
                break;
            }
        }
        a[i].data=a[i].input.substr(pos3,pos5-pos3);
        /*提取time*/
        int pos6,pos7;
        for(j=pos5;j<len;j++){
            if(a[i].input[j]!= ){
                pos6=j;
                break;
            }
        }
        pos7=a[i].input.find())+1;
        a[i].time=a[i].input.substr(pos6,pos7-pos6);
        i++;
    }
    sort(a,a+i,compare);
    for(int j=0;j<i;j++){
        cout<<a[j].input<<endl;
    }
    return 0;
}

 














以上是关于1130.日志排序的主要内容,如果未能解决你的问题,请参考以下文章

argparse 代码片段只打印部分日志

常用python日期日志获取内容循环的代码片段

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

解决远程连接mysql错误1130代码的方法

ElasticSearch学习问题记录——Invalid shift value in prefixCoded bytes (is encoded value really an INT?)(代码片段

Navicat连接Mysql(Windows环境下)报错提示错误代码1130和1251的解决方法