思路:用一个list保存错误信息,另一个list保存出现的次数。

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        ArrayList<String> list=new ArrayList<>();//存储错误信息
        ArrayList<Integer> times=new ArrayList<>();//存储出现次数
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str=in.nextLine();
            String[] strArray=str.split("\\\\");//我用\\报错
            String end=strArray[strArray.length-1];
            if(end.length()>20){//16+空格+行数=20
                end=end.substring(end.length()-20);
            }
            int index=list.indexOf(end);//得到当前错误信息在list中的下标
            if(index!=-1){//当前错误信息在list中已经存在
                times.set(index,times.get(index)+1);
            }else{//list中没有当前错误信息
                list.add(end);
                times.add(1);
            }
        }
        for(int i=list.size()>8?list.size()-8:0;i<list.size();i++){
            System.out.println(list.get(i)+" "+times.get(i));
        }
    }