一、題目
開發一個簡單錯誤記錄功能小模塊,能夠記錄出錯的代碼所在的文件名稱和行號。
處理:
1.記錄最多8條錯誤記錄,對相同的錯誤記錄(即文件名稱和行號完全匹配)只記錄一條,錯誤計數增加;(文件所在的目錄不同,文件名和行號相同也要合併)
2.超過16個字符的文件名稱,只記錄文件的最後有效16個字符;(如果文件名不同,而只是文件名的後16個字符和行號相同,也不要合併)
3.輸入的文件可能帶路徑,記錄文件名稱不能帶路徑
輸入描述:
一行或多行字符串。每行包括帶路徑文件名稱,行號,以空格隔開。
文件路徑爲windows格式
如:E:\V1R2\product\fpgadrive.c 1325
輸出描述:
將所有的記錄統計並將結果輸出,格式:文件名代碼行數數目,一個空格隔開,如: fpgadrive.c 1325 1
結果根據數目從多到少排序,數目相同的情況下,按照輸入第一次出現順序排序。
如果超過8條記錄,則只輸出前8條記錄.
如果文件名的長度超過16個字符,則只輸出後16個字符
輸入例子1:
E:\V1R2\product\fpgadrive.c 1325
輸出例子1:
fpgadrive.c 1325 1
二、代碼實現
import java.util.*;
public class SimpleErrorLog {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String path;
String fileName;
String key;
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
while (sc.hasNext()) {
path = sc.next();
int id = path.lastIndexOf("\\");
fileName = id < 0 ? path : path.substring(id + 1);
int lineNum = sc.nextInt();
// 統計頻率
key = fileName + " " + lineNum;
if (map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1);
}
}
sc.close();
printSortAndDeduplication(map);
}
private static void printSortAndDeduplication(Map<String, Integer> map) {
// 對記錄進行降序
List<Map.Entry<String, Integer>> list = new LinkedList<>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
// 降序
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return (o2.getValue() - o1.getValue() == 0 ? (o1.getValue() - o2.getValue())
: (o2.getValue() - o1.getValue()));
}
});
// 只輸出前8條記錄
int count = 0;
for (Map.Entry<String, Integer> mapping : list) {
count++;
if (count <= 8) {
String[] str = mapping.getKey().split(" ");
String m = str[0].length() > 16 ? str[0].substring(str[0].length() - 16) : str[0];
String n = str[1];
System.out.println(m + " " + n +" " + mapping.getValue());
} else {
break;
}
}
}
}