开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是”相同“的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
输入描述:
每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开
示例
输入
D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645 E:\je\rzuwnjvnuz 633 C:\km\tgjwpb\gy\atl 637 F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647 E:\ns\mfwj\wqkoki\eez 648 D:\cfmwafhhgeyawnool 649 E:\czt\opwip\osnll\c 637 G:\nt\f 633 F:\fop\ywzqaop 631 F:\yay\jc\ywzqaop 631
输出
rzuwnjvnuz 633 1 atl 637 1 rwyfvzsopsuiqjnr 647 1 eez 648 1 fmwafhhgeyawnool 649 1 c 637 1 f 633 1 ywzqaop 631 2
本题中主要解决的问题:
1.怎样获取到文件名
2.怎么取到大于16位的文件名中的后16位
3.怎么能输出后8位
因为题目中明确说了重复名以及记录个数的问题,所以我果断选用了HashMap
1.从输入中去除空格,用split()方法,获取一个字符串数组,字符串的0位置为路径,字符串的1位置为行号
2.从路径中截取最后一个"\"(此处\需要转义,所以是两个\)位置处到末尾的部分 相当于取了最后的文件名
3.拼接文件名加空格加行号为一个字符串(方便map存放)
4.利用map的key存放拼接好的字符串,value为出现的次数
5.打印map中的数据,要打印最后8个,所以用map.size()-8定位到开始打印位置
此处没放输入部分
public static void main(String[] args) { Scanner scan = new Scanner(System.in); Map<String, Integer> map = new LinkedHashMap<>(); while (scan.hasNext()) { String dir =scan.nextLine(); String[] dirs = dir.split(" "); String fileName = dirs[0]; String num = dirs[1]; // 文件名 fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); // 文件名大于 16 时,截取后面16位。 if (fileName.length() > 16) { fileName = fileName.substring(fileName.length() - 16); } // 存储数据到 map 中 String key = fileName + " " + num; map.put(key, map.getOrDefault(key, 0) + 1); } // 打印最后 8 条数据 !!!!! 最后8 条 int count = 0; for (Map.Entry<String, Integer> entry : map.entrySet()) { count++; if (count > (map.size() - 8)) { System.out.println(entry.getKey() + " " + entry.getValue()); } } } }
此类问题要熟练掌握已有的API,灵活运用来解题,练得多了就熟练了,像要去后多少多少位这样的要求,就用一个总长度减去这个数就是要的那个数开始的定位。