当前位置: 首页 > news >正文

设计一个关键字统计程序:利用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中的结果进行排序,并逐个输出关键字及其出现次数。

运行结果示例

代码

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) + "次");}}
}

相关文章:

  • P3309 [SDOI2014] 向量集 Solution
  • 浏览器界面无显示,提示“代理服务器可能有问题”,这是怎么回事呢?
  • Windows 安装 Neo4j 教程
  • 做大模型应用所需的一点点基础数学理论
  • 内存四区(栈)
  • Java24 抗量子加密:后量子时代的安全基石
  • 【MCP】了解远程MCP调用背后使用的SSE协议
  • 使用matplotlib绘制Raincloud图/云雨图/柱状图/小提琴图
  • 学习记录:DAY18
  • 图论---LCA(倍增法)
  • 使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第二部分
  • Spring Boot 3.4.5 运行环境需求
  • 精益数据分析(26/126):依据商业模式确定关键指标
  • Nginx性能优化:从配置到缓存,全面提升Web服务器性能
  • 重定向和语言级缓冲区【Linux操作系统】
  • RT-Thread学习笔记(四)
  • 【Android】四大组件之Service
  • MEME在线进行蛋白氨基酸序列的保守基序预测的具体分析步骤
  • SQL:MySQL 函数
  • 【生成式AI】从原理到实践的创造性革命
  • 六部门:进一步优化离境退税政策扩大入境消费
  • 如何做大中国拳击产业的蛋糕?这项赛事给出办赛新思考
  • 明查|把太平洋垃圾污染问题甩锅中国,特朗普用的是P过的图
  • 特朗普说克里米亚将留在俄罗斯,泽连斯基:绝不承认
  • 两部门:推动“青年驿站”为毕业生跨地区求职提供住宿优惠便利
  • 四川公布一起影视盗版案例:1个网站2人团伙盗售30多万部