题目描述:开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
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);
}
}
}
在牛客网上的运行结果: