题目描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
不得不说,C++ STL的vector+pair真是好用,相比如果用HashMap的话代码会复杂很多,而且STL的stable_sort用起来也简洁明了,Java一开始我也用HashMap但是比较的时候,要比较value值,还要提取map的entry转化为list,后来用了个自定义类+list,再用起sort函数也是方便了许多。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。 文件路径为windows格式 如:E:\V1R2\product\fpgadrive.c 1325
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。 如果超过8条记录,则只输出前8条记录. 如果文件名的长度超过16个字符,则只输出后16个字符
输入例子:
E:\V1R2\product\fpgadrive.c 1325
输出例子:
fpgadrive.c 1325 1本题要注意,排序要稳定排序,最多输出八条记录,文件名大于16要输出后16位
用C++会比Java简单,个人感觉
先附上C++代码,看看C++大法
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool compare(pair<string, int> a, pair<string, int> b){
return a.second > b.second;
}
int main(void){
string input, file;
vector<pair<string, int>> errors;
while (getline(cin, input)){
if (input.size() == 0)
break;
unsigned int f = input.rfind('\\');
file = input.substr(f + 1);
errors.push_back(make_pair(file, 1));
for (int i = 0; i<(errors.size() - 1); i++){
if (errors[i].first == file){
errors[i].second++;
errors.pop_back(); break;
}
}
}
stable_sort(errors.begin(), errors.end(), compare);
int idx = 0;
while (idx<8 && idx<errors.size()){
string check = errors[idx].first;
int t = check.find(' ');
if (t>16)
errors[idx].first.erase(0, t - 16);
cout << errors[idx].first << ' ' << errors[idx].second << endl;
idx++;
}
}
import java.util.*;
import java.util.Map.Entry;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
List<errorFile> list=new ArrayList<>();
while(in.hasNext()){
String input=in.nextLine();
String fileName=input.substring(input.lastIndexOf("\\")+1);
errorFile file=new errorFile(fileName, 1);
list.add(file);
for(int i=0;i<list.size()-1;i++){
if (list.get(i).fileName.equals(fileName)) {
list.get(i).count++;
list.remove(list.size()-1);
break;
}
}
}
Collections.sort(list, new Comparator<errorFile>() {
public int compare(errorFile o1, errorFile o2){
return o2.count-o1.count;
}
});
for(int i=0;i<list.size();i++){
if (i==8) {
break;
}
errorFile file=list.get(i);
String str=file.fileName;
int index=str.indexOf(" ");
if (index>16) {
str=str.substring(index-16);
}
System.out.println(str+" "+file.count);
}
}
}
class errorFile{
public int count;
public String fileName;
public errorFile(String name,int icount){
count=icount;
fileName=name;
}
}
不得不说,C++ STL的vector+pair真是好用,相比如果用HashMap的话代码会复杂很多,而且STL的stable_sort用起来也简洁明了,Java一开始我也用HashMap但是比较的时候,要比较value值,还要提取map的entry转化为list,后来用了个自定义类+list,再用起sort函数也是方便了许多。