import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
/*
* 报错信息处理 文件路径前三个字母为A-Z、冒号: 和"\" 代表盘符 随后是由小写字母构成的字符串 代表文件夹名
* 使用单个反斜杠间隔 路径的最后一个反斜杠是文件名
* 去除除文件名意外的全部信息 且保留文件名的最后16个字符 若保留16个字符后 文件名相同 且行号相同 则视为同一个报错
* 相同的报错信息以第一次出现的时间为准 至多输出最后八条记录
* 数据接收
* map存储处理之后相关的falseDoc和错误数量
* 数据处理
* 对falseDoc的位置截取前三位后 字符串为小写字母的文件夹名和文件名
* 将falseDoc截取后的位置字符串以”\\“分隔为字符串数组 数组长度减一即为文件名称 判断长度 取sub后16位
* 根据截取后的错误名 和行号 判断map<falseDoc,num>中是否存在这个错误 +1
* 数据输出
* 输出map存储的数据*/
//获取输入内容 FilePathAndlineCountList
Scanner scanner = new Scanner(System.in);
List<String> FilePathAndlineCountList = new ArrayList<>();
while (scanner.hasNextLine()) {
String input = scanner.nextLine().trim();
if (input.equals("")) {
break;
}
FilePathAndlineCountList.add(input);
}
Map<WrongFile, Integer> statisticsMap = new LinkedHashMap<>();
//信息处理 并将处理结果放入map中 map<文件对象{文件名,文件行数},数量>文件名和行数相同为同一错误文件
for (int i = 0; i < FilePathAndlineCountList.size(); i++) {
String TheFilePathBeforeProcessing1 = FilePathAndlineCountList.get(i);
String TheFilePathBeforeProcessing2 = FilePathAndlineCountList.get(i);
/*fileNameProcessing(TheFilePathBeforeProcessing);//获取文件名
filelineCountProcessing(TheFilePathBeforeProcessing);//获取错误行数*/
WrongFile wrongFile = new WrongFile(fileNameProcessing(
TheFilePathBeforeProcessing1),
filelineCountProcessing(TheFilePathBeforeProcessing2));
statisticsMap.put(wrongFile,
statisticsMap.getOrDefault(wrongFile, 0) + 1);
}
statisticsMap.entrySet().stream()
.skip(Math.max(0, statisticsMap.size() - 8))
.forEach(entry -> System.out.println(
entry.getKey().fileName + " " +
entry.getKey().lineCount + " " +
entry.getValue()));
}
private static int filelineCountProcessing(String theFilePathBeforeProcessing) {
theFilePathBeforeProcessing = theFilePathBeforeProcessing.substring(3,
theFilePathBeforeProcessing.length());
int lineCount = Integer.parseInt(theFilePathBeforeProcessing.split(" ")[1]);
return lineCount;
}
private static String fileNameProcessing(String theFilePathBeforeProcessing) {
//前三位截取 A-Z : \ 后按照” “分隔 [0]为路径和文件名 [1]为行数
theFilePathBeforeProcessing = theFilePathBeforeProcessing.substring(3,
theFilePathBeforeProcessing.length());
String filePath = theFilePathBeforeProcessing.split(" ")[0];
String[] fileNameArray = filePath.split("\\\\");
String fileName = fileNameArray[fileNameArray.length - 1];
if (fileName.length() > 16) {
int num = fileName.length() - 16;
fileName = fileName.substring(num, fileName.length());
return fileName;
} else {
return fileName;
}
}
}
class WrongFile {
String fileName;
Integer lineCount;
public WrongFile(String fileName, Integer lineCount) {
this.fileName = fileName;
this.lineCount = lineCount;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
WrongFile that = (WrongFile) o;
return Objects.equals(fileName, that.fileName) &&
Objects.equals(lineCount, that.lineCount);
}
@Override
public int hashCode() {
return Objects.hash(fileName, lineCount);
}
}