news 2026/10/13 9:51:13

Java:统计字符串出现次数的终极解法!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java:统计字符串出现次数的终极解法!

文章目录

  • Java:统计字符串出现次数的终极解法!
    • 问题分析
    • 解决方案
      • 方案一:使用数组统计
        • 实现步骤:
        • 示例代码:
      • 方案二:使用 HashMap 统计
        • 实现步骤:
        • 示例代码:
      • 方案三:使用 Java 8 的 Streams
        • 实现步骤:
        • 示例代码:
    • 方案对比
    • 扩展思考
      • 不区分大小写的统计
      • 排序输出
        • 示例代码(HashMap):
    • 总结
    • 希望这篇教程能帮到你!如果有任何问题,欢迎在下方留言。😊
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

Java:统计字符串出现次数的终极解法!

大家好!我是闫工,今天咱们要解决一个看似简单却暗藏玄机的问题——统计字符串中每个字符出现的次数。这道题在面试和实际开发中都非常常见,但如何写出高效、优雅且易于维护的代码呢?让我带你一步步深入。

问题分析

假设我们有一个字符串,比如str = "aabbc", 我们需要统计每个字符的出现次数,结果应该是{a:2, b:2, c:1}。看起来简单,但要写出优雅且高效的代码并不容易。

思考:

  • 如何处理不同类型的字符(字母、数字、符号)?
  • 是否区分大小写?比如A和a算同一个吗?

解决方案

方案一:使用数组统计

最直观的方法是利用数组。因为字符的范围有限,我们可以用一个数组来记录每个字符的出现次数。

实现步骤:
  1. 创建一个长度为 256 的整型数组(覆盖所有可能的 ASCII 字符)。
  2. 遍历字符串中的每个字符,将字符的 ASCII 码作为索引,数组值加 1。
  3. 最后遍历数组,找出非零的值并输出。
示例代码:
publicclassCountCharacters{publicstaticvoidmain(String[]args){Stringstr="aabbc";int[]count=newint[256];// ASCII 码范围for(charc:str.toCharArray()){count[c]++;}for(inti=0;i<count.length;i++){if(count[i]>0){System.out.println((char)i+": "+count[i]);}}}}

优缺点:

  • 优点:

    • 空间复杂度低,仅需固定大小的数组。
    • 时间复杂度 O(n),高效且快速。
  • 缺点:

    • 数组长度固定,无法处理 Unicode 字符(如中文、Emoji)。
    • 需要额外处理非打印字符(如空格、控制符)。

思考:如果我们不区分大小写,可以在统计前将所有字符转为小写或大写。比如:

for(charc:str.toLowerCase().toCharArray()){count[c]++;}

方案二:使用 HashMap 统计

如果需要处理更复杂的字符(如 Unicode),可以考虑使用HashMap,键是字符,值是出现次数。

实现步骤:
  1. 创建一个HashMap<Character, Integer>。
  2. 遍历字符串中的每个字符:
    • 如果字符不在 Map 中,添加并设置为 1。
    • 如果存在,获取当前值加 1 并更新。
  3. 最后遍历 Map 输出结果。
示例代码:
importjava.util.HashMap;importjava.util.Map;publicclassCountCharacters{publicstaticvoidmain(String[]args){Stringstr="aabbc";Map<Character,Integer>countMap=newHashMap<>();for(charc:str.toCharArray()){if(!countMap.containsKey(c)){countMap.put(c,1);}else{countMap.put(c,countMap.get(c)+1);}}// 输出结果for(Map.Entry<Character,Integer>entry:countMap.entrySet()){System.out.println(entry.getKey()+": "+entry.getValue());}}}

优缺点:

  • 优点:

    • 支持任意字符,包括 Unicode。
    • 代码更直观,易于扩展。
  • 缺点:

    • 空间复杂度略高,取决于字符串中不同字符的数量。
    • 遍历两次(一次统计,一次输出),但时间复杂度仍为 O(n)。

思考:如果我们不区分大小写,可以在遍历时统一转为小写或大写:

for(charc:str.toLowerCase().toCharArray()){// 统计逻辑不变}

方案三:使用 Java 8 的 Streams

Java 8 引入了Stream和Collectors,可以更简洁地实现统计功能。

实现步骤:
  1. 将字符串转换为字符流。
  2. 使用Collectors.groupingBy分组,并用Collectors.counting()统计数量。
  3. 输出结果。
示例代码:
importjava.util.Map;importjava.util.stream.Collectors;publicclassCountCharacters{publicstaticvoidmain(String[]args){Stringstr="aabbc";Map<Character,Long>countMap=str.chars().mapToObj(c->(char)c).collect(Collectors.groupingBy(c->c,Collectors.counting()));countMap.forEach((k,v)->System.out.println(k+": "+v));}}

优缺点:

  • 优点:

    • 代码简洁,一行搞定统计。
    • 利用函数式编程,提高可读性。
  • 缺点:

    • 性能略逊于数组和 HashMap,因为涉及 Stream 和内部对象创建。
    • 不适用于需要频繁修改的场景(比如动态更新计数)。

思考:如果我们希望结果为Integer而非Long,可以在最后转换:

Map<Character,Integer>resultMap=countMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,e->((Long)e.getValue()).intValue()));

方案对比

方法时间复杂度空间复杂度适用场景
数组统计O(n)O(1)字符范围有限(如 ASCII)
HashMapO(n)O(k)复杂字符集,可扩展性强
StreamsO(n)O(k)代码简洁,函数式编程爱好者

推荐:

  • 如果处理简单字符集(如英文字母),优先选择数组统计。
  • 如果需要处理复杂字符或区分大小写,使用HashMap或Streams。

扩展思考

不区分大小写的统计

无论采用哪种方法,在统计前将所有字符转为小写:

str=str.toLowerCase();

或者在遍历时处理:

for(charc:str.toCharArray()){charlowerC=Character.toLowerCase(c);// 统计逻辑}

排序输出

如果需要按照字符顺序输出统计结果,可以对 Map 的键进行排序。

示例代码(HashMap):
List<Character>sortedKeys=newArrayList<>(countMap.keySet());sortedKeys.sort(Character::compareTo);for(Characterc:sortedKeys){System.out.println(c+": "+countMap.get(c));}

总结

根据具体需求选择合适的统计方式:

  • 性能优先:数组统计。
  • 扩展性优先:HashMap 或 Streams。
  • 代码简洁:Streams。

希望这篇教程能帮到你!如果有任何问题,欢迎在下方留言。😊

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 4:14:19

疯狂!2500辆Waymo robotaxi上路,完成160亿美元融资,估值破1260亿美元

据报道&#xff0c;Alphabet旗下自动驾驶子公司Waymo近日宣布完成新一轮巨额融资&#xff0c;投后估值高达1260亿美元&#xff08;约合人民币8760亿元&#xff09;&#xff0c;这意味着该公司的估值在过去一年半内翻了近三倍。这一里程碑事件标志着Waymo正式进入了“疯狂”规模…

作者头像 李华
网站建设 2026/10/8 17:40:44

基于python和Vue的公司文档档案借阅管理系统设计与开发-pycharm DJANGO FLASK

文章目录 系统架构设计核心功能模块技术实现要点安全与权限控制部署方案 大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统架构设计 采用前后端分离架构&#xff0c;前端使用Vue.js框架…

作者头像 李华
网站建设 2026/10/11 20:17:26

基于python的心理咨询在线评测系统设计与开发-pycharm DJANGO FLASK

文章目录心理咨询在线评测系统设计与开发摘要系统背景与目标技术选型与架构核心功能模块关键技术实现创新点与优势应用前景大数据系统开发流程主要运用技术介绍源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;心理咨询在线评测系…

作者头像 李华
网站建设 2026/10/11 2:13:07

案例分享|复杂仿真应用定制——UAVSim无人机仿真APP

导读 「神工坊」核心技术——「SimForge HSF™高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行&#xff0c;以及多域耦合、AI求解加速&#xff0c;目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地&#xff0c;支持10亿阶、100w核心量级的高效求解。其…

作者头像 李华
网站建设 2026/10/12 20:40:29

YOLOv8系统分析报告(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

YOLOv8系统分析报告(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码YOLOv8系统分析报告&#xff0c;YOLO基本原理、v8创新、网络架构、训练方法都有&#xff0c;还有PyQt介绍。 基于深度学习的垃圾分类系统(有交通标志识别&…

作者头像 李华
网站建设 2026/10/9 19:01:30

计算机毕设java校园智能停车收费系统设计与实现 基于Java的校园智能停车管理系统的设计与开发 Java技术驱动的校园智能停车收费解决方案

计算机毕设java校园智能停车收费系统设计与实现wv19j9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着社会经济的快速发展和人们生活水平的不断提高&#xff0c;校园内的车…

作者头像 李华