在Java中如何实现字符串统计工具_Java字符串处理实战解析

发布时间 - 2026-02-01 00:00:00    点击率:
最直接方式是遍历字符串用HashMap统计字符频次,键用Character,避免null异常需用getOrDefault;单词统计应split("\s+")并转小写;流式写法注意chars()对中文不准确,应用codePoints();预处理推荐toLowerCase().replaceAll("1", "")。\p{L}\p{Nd}\s ↩

如何用 HashMap 统计字符串中每个字符出现次数

最直接、可控的方式是遍历字符串,用 HashMap 记录频次。注意 char 是基本类型,Character 才能作为泛型键;遇到空格、换行、标点也要纳入统计(除非业务明确排除)。

常见错误:用 get() 获取旧值后直接 ++,但 get() 返回 null 时会抛 NullPointerException。应改用 getOrDefault(ch, 0)

示例关键片段:

Map freq = new HashMap<>();
for (char ch : str.toCharArray()) {
    freq.put(ch, freq.getOrDefault(ch, 0) + 1);
}

统计单词频次时为什么 split("\\s+")split(" ") 更可靠

split(" ") 只按单个空格切分,遇到制表符、连续空格或首尾空格会产生空字符串,导致 "" 被误计为单词。而 split("\\s+") 匹配一个或多个空白字符(包括 \t\n\r),天然过滤掉冗余分隔。

还需注意:英文单词通常需转小写再统计(word.toLowerCase()),否则 "Hello""hello" 算两个词;中文文本则无

需此步,但要考虑是否要剔除标点——可用 replaceAll("[\\p{Punct}&&[^']]", "") 保留英文撇号(如 don't)。

Collectors.groupingBy 实现一行统计的陷阱

Java 8+ 可用流式写法:str.chars().mapToObj(c -> (char) c).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))。但要注意:

  • str.chars() 返回的是 IntStream,直接 mapToObj(c -> c) 会装箱成 Integer,必须显式转 (char) c 否则键类型错
  • 中文字符(Unicode 辅助平面)可能被拆成两个 char(代理对),此时 chars() 无法正确识别单个汉字,应改用 codePoints() 并映射为 Stringint
  • 性能上,流式写法比传统循环慢 2–3 倍,大数据量时不建议无脑用

忽略大小写 + 排除标点的完整预处理怎么做

真实场景中,统计前往往要标准化输入。推荐组合使用:

str.toLowerCase().replaceAll("[^\\p{L}\\p{Nd}\\s]", "") —— 先转小写,再删除所有非字母、非数字、非空白字符。其中 \\p{L} 匹配任意语言字母(含中文、日文平假名等),\\p{Nd} 匹配任意数字,比硬写 [a-z0-9] 更健壮。

若还要保留内部撇号(如英文缩写),可改为:replaceAll("[^\\p{L}\\p{Nd}'\\s]", ""),但需额外 .replaceAll("'+", "'") 合并连续单引号。

这一步漏掉 Unicode 字母支持,会导致中文、阿拉伯文等完全丢失;只删 ASCII 标点(如 [^a-zA-Z0-9\\s])也会让中文句号、顿号残留进单词里。


# word  # java  # 大数据  # 工具  # stream  # 为什么  # String  # Integer  # NULL  # 字符串  # char  # int  # 循环  # Chars  # 泛型  # function  # ASCII  # 遍历  # 流式  # 阿拉伯文  # 但要  # 的是  # 切分  # 多个  # 日文  # 也要  # 英文 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在宝塔面板中修改默认建站目录?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  js实现获取鼠标当前的位置  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  详解vue.js组件化开发实践  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  香港服务器如何优化才能显著提升网站加载速度?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  详解jQuery中的事件  Python文件异常处理策略_健壮性说明【指导】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  怎样使用JSON进行数据交换_它有什么限制  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel安装步骤详细教程_Laravel环境搭建指南  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  详解Android中Activity的四大启动模式实验简述  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  如何破解联通资金短缺导致的基站建设难题?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Python自动化办公教程_ExcelWordPDF批量处理案例  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  昵图网官方站入口 昵图网素材图库官网入口  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  网站制作企业,网站的banner和导航栏是指什么?  Linux安全能力提升路径_长期防护思维说明【指导】  米侠浏览器网页背景异常怎么办 米侠显示修复  如何在腾讯云服务器上快速搭建个人网站?  Laravel怎么判断请求类型_Laravel Request isMethod用法  网站建设保证美观性,需要考虑的几点问题!  EditPlus中的正则表达式 实战(1)  潮流网站制作头像软件下载,适合母子的网名有哪些?  JavaScript Ajax实现异步通信  高防服务器租用指南:配置选择与快速部署攻略  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel如何使用Telescope进行调试?(安装和使用教程)  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何快速搭建二级域名独立网站?  焦点电影公司作品,电影焦点结局是什么?