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

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

文章目录

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

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

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

问题分析

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

思考:

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

解决方案

方案一:使用数组统计

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

实现步骤:
  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 引入了StreamCollectors,可以更简洁地实现统计功能。

实现步骤:
  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)代码简洁,函数式编程爱好者

推荐:

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

扩展思考

不区分大小写的统计

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

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!

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

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

http://www.jsqmd.com/news/337157/

相关文章:

  • 26.子网格 (Subgrid)
  • 2026年知名的不粘锅/无油烟不粘锅厂家选购指南与推荐 - 品牌宣传支持者
  • 2026年江山欧派推荐:基于多场景应用评价,针对家装协同与环保痛点精准指南 - 品牌推荐
  • csp信奥赛C++完整学习规划!一站式提升,冲刺一等奖!
  • 美国市场营销求职辅导哪家高效:营销辅导独家揭秘 - 技研备忘录
  • SonarQube Server 2026.1 LTA 发布 - 代码质量、安全与静态分析工具
  • python使用vscode打断点调试
  • 2026年香港留学中介十强解析,值得信赖的机构推荐 - 留学机构评审官
  • 2026年质量好的五轴零配件机械加工/五轴机械加工厂家推荐及选择指南 - 品牌宣传支持者
  • 2026年2月骨胶原钙产品推荐:多品牌守护骨骼健康,补钙更锁钙 - 速递信息
  • 2026年郑州留学中介前十,经验丰富机构提供专业指导 - 留学机构评审官
  • 手机长焦镜头技术发展史与现状
  • 美国市场营销求职中介哪家高效:十大中介精选攻略 - 技研备忘录
  • 合肥硕士留学中介如何选?前十稳定可靠推荐指南 - 留学机构评审官
  • 别再说没出路!2026中专大数据专业毕业生的真实就业方向与起薪揭秘
  • 详细介绍:FreeRTOS任务管理详解中: FreeRTOS任务创建与删除实战教程(动态方法)
  • 济南最好的研究生留学机构,负责全程服务,助您留学之路顺利成功 - 留学机构评审官
  • 荣耀节后新品阵容曝光:笔记本、折叠屏领衔 还有平板
  • 左手财务,右手数据:2026大专生如何用“大数据+财务”双引擎引爆职场?
  • 2026年口碑好的机械臂/搬运机械手厂家推荐及选购指南 - 品牌宣传支持者
  • 2026年江山欧派深度解析:聚焦研发创新与智能制造,剖析全屋定制市场格局 - 品牌推荐
  • 郑州研究生留学机构前十强揭秘,零差评口碑全面解析 - 留学机构评审官
  • 2026年热门的电动同步升降器/气动同步升降器厂家推荐及选择参考 - 品牌宣传支持者
  • 2026年比较好的意大利全域定制五金/意大利定制五金厂家质量参考评选 - 品牌宣传支持者
  • 2026年有名的户外团建品牌企业,深圳大熊体育服务超贴心 - 工业设备
  • 北京化工产品配送有优质资源的公司推荐,哪家更值得选 - 工业设备
  • 盘点温州口碑不错的钢骨架日光温室供应商,山东冠创值得关注 - 工业品网
  • 深聊2026年汽油发电机组厂家,京津冀晋鲁地区哪个品牌好用 - 工业推荐榜
  • 重庆可靠的GEO优化品牌企业有哪些 - 工业品网
  • 如何为不同工程选木门?2026年江山欧派全面评测与推荐,直击耐用与设计痛点 - 品牌推荐