news 2026/4/23 11:03:53

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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!

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

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

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

给无人机装上“蚂蚁之眼”:基于ZYNQ的仿生智能导航系统深度解析

想象一下,当GPS信号消失在林荫隧道或城市峡谷中,无人机依然能像沙漠蚂蚁一样,借助天空中的偏振光找到回家的路。这不再是科幻场景,而是我们正在构建的智能导航现实。 当你的无人机飞入城市峡谷、地下隧道或是茂密森林时,GPS信号变得微弱甚至完全消失,传统的导航系统便会陷…

作者头像 李华
网站建设 2026/4/23 14:35:29

【PMP】规划与整合管理

一、变更管理 变更管理的核心原则&#xff1a;“基准已批&#xff0c;动之必变&#xff1b;流程闭环&#xff0c;先批后做”&#xff0c;任何影响范围、进度、成本基准的变更&#xff0c;必须遵循标准流程。 1. 变更管理核心流程 识别变更需求&#xff1a;发现问题/机会&…

作者头像 李华
网站建设 2026/4/23 14:55:18

时间或非宇宙基本要素,科学家提出颠覆性信息时空观

来源&#xff1a;科学剃刀2026年1月29日&#xff0c;物理学家Florian Neukart在《The Conversation》发表文章。文章指出&#xff0c;时间可能并非宇宙的基本成分。这一观点基于信息论。它试图解决现代物理学的核心矛盾。 如果这一理论成立&#xff0c;我们对现实的理解将被彻底…

作者头像 李华
网站建设 2026/4/23 16:17:43

制造业网站用WordPress导入PPT手册,如何确保图片动画效果?

要求&#xff1a;开源&#xff0c;免费&#xff0c;技术支持 博客&#xff1a;WordPress 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 功能&#xff1a;导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台&#xff1a;Window…

作者头像 李华
网站建设 2026/4/23 14:50:21

vue-cli项目中如何实现内网大文件的加密上传?

【一个被4G大文件逼疯的北京码农自述&#xff1a;如何在信创环境下优雅地让政府文件"飞"起来】 各位战友好&#xff0c;我是老张&#xff0c;北京某软件公司前端组"秃头突击队"队长。最近接了个政府项目&#xff0c;客户要求用国产环境上传4G大文件&#x…

作者头像 李华