我的思路比较直接明了 第一步,先将字符串进行提取,切割为file和position 第二步,由于存在相同file不同position,那么在存储到Map中时要注意,将file+position作为唯一key,防止文件名相同导致key重复。 第三步,创建一个对象,保存position和出现次数count。每次再插入一条新数据时先查询,如果存在就取出将count+1,没有就新添加。 第四步,到这里时我们已经将所有错误记录了,只需要将map中后8位数据提取即可,在输出时将fileName的position切割去除即可。
总体来说不难,利用了LinkedHashMap存储有序性,老API工程师了。。。。
import java.util.*;
public class Main {
static class PositionCount{
private String position;
private int count;
public PositionCount(String position, int count) {
this.position = position;
this.count = count;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public static void main(String[] args){
Scanner s = new Scanner(System.in);
LinkedHashMap<String,PositionCount> linkedMap = new LinkedHashMap<>();
while (s.hasNextLine()){
String line = s.nextLine();
if (line.equals("")) break;
String[] files = line.split("\\s");
String[] splits = files[0].split("\\W");
String fileName = splits[splits.length-1];
if (fileName.length() >= 16){
fileName = fileName.substring(fileName.length()-16);
}
// 先查询
PositionCount hasP = linkedMap.get(fileName+"+"+files[1]);
PositionCount positionCount;
if (Objects.nonNull(hasP)){
hasP.setCount(hasP.getCount()+1);
positionCount = hasP;
}else {
positionCount = new PositionCount(files[1], 1);
}
// 存储
linkedMap.put(fileName+"+"+files[1],positionCount);
}
List<String> keys = new ArrayList<>();
linkedMap.forEach(
(file, p) -> {
keys.add(file);
}
);
for (int i = keys.size() >= 8 ? keys.size()-8 : 0; i < keys.size(); i++) {
String file = keys.get(i);
PositionCount positionCount = linkedMap.get(file);
System.out.println(file.split("\\W")[0]+" "+positionCount.getPosition()+" "+positionCount.getCount());
}
}
}