我的思路比较直接明了 第一步,先将字符串进行提取,切割为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());
        }

    }
}