zoukankan      html  css  js  c++  java
  • 图解算法——简单错误记录

    1、题目描述

    开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
    处理:
    1> 记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并);
    2> 超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并);
    3> 输入的文件可能带路径,记录文件名称不能带路径。

    2、示例

    输入描述:

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

    如:E:V1R2productfpgadrive.c 1325

    输出描述:

    将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
    如果超过8条记录,则只输出前8条记录.
    如果文件名的长度超过16个字符,则只输出后16个字符。

    示例1:

    输入:

    E:V1R2productfpgadrive.c 1325

    输出:

    fpgadrive.c 1325 1

    解释:

    fpgadrive.c是文件名字,后面的1 表示出现了一次。

    3、解题思路

    需要注意的点有如下几个:

    1> 利用String的split方法分割反斜杠(),split()里是正则表达式,如要以反斜杠分割,需要是str.split("\\"),如要是以空格分割,是str.split("\s");

    2> 我们知道要用map,但是用有序的 linkedhashMap 还是 无序的 hashmap,答案肯定是有序的;

    3> 选好了数据结构,那么map中的key 和 value分别是什么呢?一开始我选的 key 是文件名(xxxxxxx.c),value 是另一个submap<String, Integer>,submap中的subkey 是行数,subvalue是错误的次数。但是后来发现不对,应当以文件名和空格和行数作为 map 的key ,次数作为map 的value,愿意主要有两个:一是结构更为简单,没有嵌套的map;二是题目中说了只要文件名和行数一样,就按照一样的叠加处理,不管他路径如何。既然题目中都这样说了,我们干嘛还要将文件名和行数拆开复杂化呢?你说是吧?

    代码如下:

    import java.util.*;
    
    public class Main{
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            //因为要求是相同情况下按输入顺序输出,故这里就不能用hashmap了,应该用有序的linkedhashmap;
            Map<String,Integer> map = new LinkedHashMap<String,Integer>();
            //Map<String,Integer> map = new HashMap<String,Integer>();
            
            while(sc.hasNext()){
                //获得文件名和空格和行数,三者组成的字符串,作为map中的key;
                String[] strs = sc.nextLine().split("\\");
                String filename = strs[strs.length - 1];
                //判断是否包含该文件名和行数的key
                if(!map.containsKey(filename)){
                    map.put(filename,1);
                }else{
                    map.put(filename,map.get(filename)+1);
                }
            }
            //为了排序输出,故将map中的Entry<k,v>转存入list列表中,并利用容器类Collections的sort() 的方法进行排序;
            List<Map.Entry<String,Integer>> list = new ArrayList<>(map.entrySet());
            Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
                @Override
                public int compare(Map.Entry<String,Integer> o1, Map.Entry<String,Integer> o2){
                    return o2.getValue().compareTo(o1.getValue());
                }
            });
            //最多输出八次
            for(int i = 0; i<8; i++){
                String[] strs = list.get(i).getKey().split("\s");
                //文件名长度输出最后16位
                if(strs[0].length() > 16){
                    strs[0] = strs[0].substring(strs[0].length()-16);
                }
                System.out.println(strs[0]+" "+strs[1]+" "+list.get(i).getValue());
            }
            sc.close();
        }
    }

    Over..........

  • 相关阅读:
    1226 倒水问题
    1230 元素查找
    2152 滑雪
    1099 字串变换 2002年NOIP全国联赛提高组
    3027 线段覆盖 2
    P2066 机器分配
    spring的作用及优势---第一个spring示例
    密码框显示提示文字
    紫薇~还记得大明湖畔的HTML5智力拼图吗?
    细说javascript函数
  • 原文地址:https://www.cnblogs.com/gjmhome/p/15083004.html
Copyright © 2011-2022 走看看