当前位置: 首页 > 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) + "次");}}
}

http://www.xdnf.cn/news/153685.html

相关文章:

  • Spring Boot 3.4.5 运行环境需求
  • k8s学习记录(四):节点亲和性
  • 经典题型02——python
  • WebSocket + Protobuf 高性能游戏服务端实现
  • 零基础上手Python数据分析 (24):Scikit-learn 机器学习初步 - 让数据预测未来!
  • Weaviate使用入门:从零搭建向量数据库的完整指南
  • 区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈
  • Dify 使用 excel 或者 csv 文件创建知识库
  • 跟着deepseek学golang--Go vs Java vs JavaScript三语言的差异
  • 计算机视觉与深度学习 | LSTM原理及与卡尔曼滤波的融合
  • C++17 折叠表达式
  • IP数据报发送和转发的过程
  • 腾讯云物联网平台
  • Win7 SSL证书问题
  • 小程序Npm package entry file not found?
  • 总账主数据——Part 2 科目-2
  • 【落羽的落羽 C++】vector
  • 算法习题-力扣446周赛题解
  • 通过门店销售明细表用Python Pandas得到每月每个门店的销冠和按月的同比环比数据
  • 搜广推校招面经八十二
  • Springboot集成SSE实现消息推送+RabbitMQ解决集群环境下SSE通道跨节点事件推送问题
  • 计算机网络 | Chapter1 计算机网络和因特网
  • CANape与MATLAB数据接口技术详解
  • Java进阶--面向对象设计原则
  • 基于html-css-js的尚有选页面源码详细
  • 如何解决IDE项目启动报错 error:0308010C:digital envelope routines::unsupported 问题
  • 图论---LCA(倍增法)
  • 从新手到高手:小程序开发进阶技巧分享
  • SQL 查询进阶:WHERE 子句与连接查询详解
  • Myweb项目——面试题总结