【编程题】简单错误记录 Java实现

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

输入描述:

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

    文件路径为windows格式

    如:E:\V1R2\product\fpgadrive.c 1325

输出描述:

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

    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。

    如果超过8条记录,则只输出前8条记录.

    如果文件名的长度超过16个字符,则只输出后16个字符

解题思路:这个题的意思是先输入不确定行数的字符串,每行形式为:c:\aaa\bbb.txt  666,然后统计其出现的次数,对于两个文件,如果文件名相同(不用管目录,只看最后的文件名),行号相同 , 我们就认为这两个文件是同一个文件,如果输入的文件中有这种相同的文件,就在出现的次数那里加一,如果输入的文件之前没有输入过,就添加新文件。

首先,我这里定义了一个类,用来表示错误信息,其中包括文件名,行号, 次数,具体结构如下:

然后用一个死循环来输入信息,将信息存放在一个ArrayList中,判断当有重复的文件输入的时候,不用add进list中,只是给count加一,当输入结束之后,可以按ctrl d 来结束输入(这一步用于调试程序),执行到断点处,然后对list按出现的次数进行排序。最后打印前8条数据就可以了。

import java.util.*;
//定义一个类,用来描述错误文件的信息,这里只是用来辅助解题,就不使用private等关键字了
class ErrorFile {
    // 文件名
    String fileName ;
    // 行号
    int lineNum ;
    //  错误计数 次数默认是1,因为一旦输入一个文件,它就出现了一次,当有重复文件出现的时候,在给次数加一
    int count = 1;
}
public class Main {
    public static void main(String[] args) {

        Scanner scanner  = new Scanner(System.in);
        List<ErrorFile> list = new ArrayList<>();
        // 死循环输入信息 调试的时候按ctrl d 跳出循环 往后执行
        while (scanner.hasNext())
        {
            ErrorFile record = new ErrorFile(); 
            String[] lines = scanner.nextLine().split(" "); // 将输入的每一行按空格拆分后,第一个是文件名/文件路径 第二个是行数
            String name = lines[0]; // 取得文件名
            int index = name.lastIndexOf('\\'); // 找到最后一个 \ 的下标位置 (C:\aaa\bbb.txt),因为要获取文件名bbb.txt
            record.fileName = (index<0)?name:name.substring(index+1); // 如果index < 0 表示输入的文件名中没有 \ ,就说明输入的不是路径,而是文件名
            record.lineNum = Integer.parseInt(lines[1]); // 获取行号
            boolean flag = true; //设置一个标志
            for (ErrorFile er : list) // 遍历list集合
            {
                if (er.fileName.equals(record.fileName) && er.lineNum == record.lineNum) // 如果有文件名和行号都相同的文件,就让count++,让标志flag = false
                {
                    er.count++;
                    flag = false;
                }
            }
            if (flag) // 如果flag 没有设置为false,就说明list中没有还当前这个文件信息,就把它add到list中去
            {
                list.add(record);
            }
        }
        scanner.close(); // 输入结束之后
        Collections.sort(list, (o1, o2) -> (o1.count-o2.count)*(-1)); //给list按count排序,这里使用的是lambda表达式,也可以使用下面这几行代码代替
//        Collections.sort(list, new Comparator<ErrorFile>() {
//            @Override
//            public int compare(ErrorFile o1, ErrorFile o2) {
//                return (-1)*(o1.count-o2.count);
//            }
//        });
       // 遍历list中前8个元素
        for (int i=0; i<((list.size()>8)?8:list.size()); i++)
        {
            ErrorFile er = list.get(i);
            String fileName = er.fileName;
            String name = (fileName.length()>16)?fileName.substring(fileName.length()-16):fileName;
            int lineNum = er.lineNum;
            int count = er.count;
            System.out.println(name+" "+lineNum+" "+count);
        }
    }
}

 

在牛客网上的运行结果:

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值