设计一个关键字统计程序:利用HashMap存储关键字统计信息,对用户输入的关键字进行个数统计。

思路分析

首先,在KeywordCounter类中,定义了一个包含所有Java关键字的字符串数组KEYWORDS,用于存储所有关键字。然后创建了一个Scanner对象input,用于从标准输入读取用户的输入。接下来创建了一个StringBuilder对象sb,用于存储读取的每一行输入内容。同时,还创建了一个HashMap对象map,用于存储每个关键字的出现次数。

在一个无限循环中,通过input.nextLine()方法逐行读取用户输入的内容,并判断是否等于"exit",如果是则跳出循环。否则,将读取到的内容传递给processLine()方法进行处理,并将处理结果添加到sb中。

接下来,将sb转换为一个字符串content。对content进行预处理,首先调用removeCommentsAndStrings()方法去除注释和字符串,并将处理后的内容重新赋值给content。然后使用正则表达式content.replaceAll("[^a-zA-Z]", " ")将非字母字符替换为空格,得到只包含字母的单词。

content按照空格进行分割,将分割后的单词存储在words数组中。接着调用countKeywords()方法,遍历words数组,如果单词在KEYWORDS数组中,则将该单词作为键,存储在map中,并增加对应关键字的计数。

最后,调用printKeywordCounts()方法,对map中的结果进行排序,并逐个输出关键字及其出现次数。

运行结果示例

代码

java 复制代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class KeywordCounter {

    private static final String[] KEYWORDS = {"abstract", "assert", "boolean", "break", "byte", "case", "catch",
            "char", "class", "const", "continue", "default", "do", "double", "else",
            "enum", "extends", "false", "final", "finally", "float",
            "for", "goto", "if", "implements", "import", "instanceof",
            "int", "interface", "long", "native", "new", "null", "package",
            "private", "protected", "public", "return", "short", "static",
            "strictfp", "super", "switch", "synchronized", "this", "throw",
            "throws", "transient", "true", "try", "void", "volatile", "while"};

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        Map<String, Integer> map = new HashMap<>();

        while (true) {
            String line = input.nextLine();
            if ("exit".equals(line)) {
                break;
            }
            sb.append(processLine(line)).append(" ");
        }

        String content = sb.toString();
        content = removeCommentsAndStrings(content);
        content = content.replaceAll("[^a-zA-Z]", " ");

        String[] words = content.split("\\s+");
        countKeywords(words, map);

        printKeywordCounts(map);
    }

    private static String processLine(String line) {
        if (line.matches("(.*)//(.*)")) {
            return line.split("//", 2)[0];
        } else {
            return line;
        }
    }

    private static String removeCommentsAndStrings(String content) {
        content = content.replaceAll("/\\*(?:.|[\\n\\r])*?\\*/", " ");
        content = content.replaceAll("\".*?\"", " ");
        return content;
    }

    private static void countKeywords(String[] words, Map<String, Integer> map) {
        for (String word : words) {
            if (Arrays.asList(KEYWORDS).contains(word)) {
                map.put(word, map.getOrDefault(word, 0) + 1);
            }
        }
    }

    private static void printKeywordCounts(Map<String, Integer> map) {
        Set<String> keySet = map.keySet();
        String[] keys = keySet.toArray(new String[0]);
        Arrays.sort(keys);
        for (String key : keys) {
            //System.out.println(map.get(key) + "\t" + key);
        	System.out.println(key + ":" + "\t" + map.get(key) + "次");
        }
    }
}
相关推荐
Highcharts.js几秒前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
啊阿狸不会拉杆5 分钟前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
摇滚侠6 分钟前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python
禹凕10 分钟前
Python编程——进阶知识(面向对象编程OOP)
开发语言·python
九.九16 分钟前
CANN 算子生态的底层安全与驱动依赖:固件校验与算子安全边界的强化
大数据·数据库·安全
蓝帆傲亦20 分钟前
代码革命!我用Claude Code 3个月完成1年工作量,这些实战经验全给你
jvm·数据库·oracle
一晌小贪欢20 分钟前
深入理解 Python HTTP 请求:从基础到高级实战指南
开发语言·网络·python·网络协议·http
七牛云行业应用21 分钟前
1M上下文腐烂?实测Opus 4.6 vs GPT-5.3及MoA降本架构源码
人工智能·python·llm·架构设计·gpt-5·claude-opus
亓才孓24 分钟前
[JDBC]事务
java·开发语言·数据库
PD我是你的真爱粉29 分钟前
FastAPI使用tortoiseORM
数据库·fastapi