思路

这道题的描述让人很摸不着头脑。

其实就是把输入的东西进行一个计数操作,而且输出的时候只输出最新的8条数据。

计数器这种东西一般生产环境都喜欢用redis一类的组件,其实就是一个key-value结构的数据存储。因此我们用Java求解的时候只需要用到Map就可以了。

这里还有一个问题就是只要最新的8条记录,借助一个栈或者队列其实都能够实现。

代码

import java.sql.Statement;
import java.util.*;

public class Main {
    public static void main(String[] arg) {
        Scanner scanner = new Scanner(System.in);
        Stack<String> stack = new Stack<>();
        Map<String, Integer> map = new HashMap<>();
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            // 第一次分解按照分隔符
            String[] arr1 = line.split("\\\\");
            // 拿到最后一个元素,大致这样 ssss 123
            String lastString = arr1[arr1.length - 1];
            String[] tempArr = lastString.split(" ");
            // 文件名
            String fileName = tempArr[0];
            // 行号
            String lineNo = tempArr[1];
            // 大于16的,要16个字符以后
            String regFileName = fileName.length() > 16 ? fileName.substring(fileName.length() - 16) : fileName;
            String key = regFileName + " " + lineNo;
            if (stack.contains(key)) {
                map.put(key, map.get(key) + 1);
            } else {
                stack.push(key);
                map.put(key, 1);
            }

        }
        Stack<String> stack1 = new Stack<>();
        int i = 0;
        while (!stack.isEmpty()) {
            if (i == 8) {
                break;
            }
            stack1.push(stack.peek() + " " + map.get(stack.pop()));
            i++;
        }
        while (!stack1.isEmpty()) {
            System.out.println(stack1.pop());
        }
    }

}