Java教程

简单错误记录(牛客网)

本文主要是介绍简单错误记录(牛客网),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 题目描述
  • 一、思路分析
  • 二、代码实现
  • 总结


题目描述

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

处理:

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,灵活运用来解题,练得多了就熟练了,像要去后多少多少位这样的要求,就用一个总长度减去这个数就是要的那个数开始的定位。

这篇关于简单错误记录(牛客网)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!