简单错误记录

题目描述

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

处理: 

1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;

2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;

3、 输入的文件可能带路径,记录文件名称不能带路径。

输入描述:

一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

输出描述:

将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

输入例子:
E:\V1R2\product\fpgadrive.c   1325
输出例子:
fpgadrive.c 1325 1

思路1:(有问题,通过10%)
首先对要统计次数,然后对统计次数后的对象进行稳定排序,最后是输出时记得检查文件名的长度
重点:自定义类,并自定义比较规则
MyObject类,包括文件名和错误行号的字符串,错误统计次数
import java.util.*;

class MyObject implements Comparable<MyObject>{//自定义的类,并自定义比较规则
    String nameNo;//文件名和错误行号的字符串
    int count;//错误统计次数
    
    public int compareTo(MyObject o){
        return o.count-this.count;
    }
    
    public MyObject(String nameNo,int count){
        super();
        this.nameNo=nameNo;
        this.count=count;
    }
    
    public String getNameNo(){
        return nameNo;
    }
    
    public void setNameNo(String nameNo){
        this.nameNo=nameNo;
    }
    
    public int getCount(){
        return count;
    }
    
    public void setCount(int count){
        this.count=count;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        ArrayList<MyObject> ob=new ArrayList<MyObject>();
        while(sc.hasNext()){
            String line=sc.nextLine();
            String nameNo=line.trim().substring(line.trim().lastIndexOf("\\")+1);//文件名和行号
            
            boolean flag=false;
            for(int j=0;j<ob.size();j++){
                if(ob.get(j).getNameNo().equals(nameNo)){//存在
                    MyObject temp=ob.get(j);
                    temp.setCount(temp.getCount()+1);
                    ob.set(j,temp);
                    flag=true;
                    break;
                }
            }
            if(flag==false){//不存在
                MyObject o=new MyObject(nameNo,1);
                ob.add(o);
            }
        }//数据处理完毕
        
        Collections.sort(ob);//稳定排序
        int coun=0;
        while(coun<8&&coun<ob.size()){
            String[] temp=ob.get(coun).getNameNo().split(" ");
            String filename=temp[0].substring(temp[0].lastIndexOf("\\")+1);
            if(filename.length()>16)
                filename.substring(filename.length()-16);
            System.out.println(filename+" "+temp[1]+" "+ob.get(coun).getCount());
            coun++;
        }
    }
}

 思路2:

 

所谓 “记录最多8条错误记录,循环记录”,就是输出 map 最后8个元素
//纯粹的考代码实现能力
//记录个数,故使用Map,不需要排序故使用HashMap,根据题意是要循环输出,而且提交一次会有测试用例提示,需要按照输入顺序输出,故使用LinkedHashMap
//在输出的时候,题目的意思是循环八个,但问题是必须记录全部错误个数,否则刚记录完后弹出了,错误数就对不上了,跟操作系统里的缺页有那么点相似。
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Map<String, Integer> map=new LinkedHashMap<String, Integer>();
        while(sc.hasNext()){
            String str=sc.next();
            int linenum=sc.nextInt();
            String[] arr=str.split("\\\\");  //根据\切割
            String s=arr[arr.length-1];
            if(s.length()>16)  //截取
                s=s.substring(s.length()-16);
            String key=s+" "+linenum;
            int value=1;
            if(map.containsKey(key))
                map.put(key, map.get(key)+1);
            else {
                map.put(key, value);
            }
        }
        int count=0;
        for(String string:map.keySet()){
            count++;
            if(count>=(map.keySet().size()-8)) //输出最后八个记录
                System.out.println(string+" "+map.get(string));
        }
    }
}

 


posted @ 2017-04-19 18:08  临江仙zhe  阅读(65)  评论(0)    收藏  举报