题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
利用LinkHashMap来实现lru, 从而实现保存最新8个记录的功能
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
HashMap<FileElementDO, Integer> delHistoryData = new HashMap<>();
LinkedHashMap<FileElementDO, Integer> hashMap = new
LinkedHashMap<FileElementDO, Integer>() {
@Override
protected boolean removeEldestEntry(Map.Entry<FileElementDO, Integer> eldest) {
boolean del = this.size() > 8;
if (del) {
delHistoryData.put(eldest.getKey(), eldest.getValue());
}
return del;
}
};
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String line = in.nextLine();
if (Objects.equals(line, "#")) {
break;
}
String[] split = line.split(" ");
String fileDireNam = split[0];
Integer lineNum = Integer.valueOf(split[1]);
fileDireNam = fileDireNam.substring(fileDireNam.lastIndexOf("\\") + 1);
int N = fileDireNam.length();
if (N > 16) {
fileDireNam = fileDireNam.substring(N - 16);
}
FileElementDO fileElementDO = new FileElementDO(fileDireNam, lineNum);
// 删除列表中有记录
if (delHistoryData.containsKey(fileElementDO)) {
continue;
}
if (hashMap.containsKey(fileElementDO)) {
hashMap.put(fileElementDO, hashMap.get(fileElementDO) + 1);
} else {
hashMap.put(fileElementDO, 1);
}
}
for (Map.Entry<FileElementDO, Integer> entry : hashMap.entrySet()) {
FileElementDO key = entry.getKey();
System.out.println(key.fileName + " " + key.lineNum + " " + entry.getValue());
}
}
static class FileElementDO {
private String fileName;
private Integer lineNum;
FileElementDO(String fileName, Integer lineNum) {
this.fileName = fileName;
this.lineNum = lineNum;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof FileElementDO)) {
return false;
}
FileElementDO dest = (FileElementDO) obj;
return Objects.equals(this.fileName, dest.fileName) &&
Objects.equals(this.lineNum, dest.lineNum);
}
@Override
public int hashCode() {
return fileName.hashCode() + lineNum.hashCode();
}
}
}