news 2026/5/11 3:39:28

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/5/3 11:22:39

vue.js如何支持内网视频大文件的分片上传?

网工大三党文件上传救星&#xff1a;原生JS实现10G大文件上传&#xff08;Vue3IE8兼容&#xff09; 兄弟&#xff0c;作为刚入坑网络工程的山西老狗&#xff0c;我太懂你现在的处境了——老师要10G大文件上传的毕业设计&#xff0c;网上找的代码全是“断头路”&#xff0c;后端…

作者头像 李华
网站建设 2026/5/10 15:56:45

<span class=“js_title_inner“>中产返贫三件套,一样都别沾!</span>

我记得有次和一个朋友聊起他家的经济状况。他说&#xff1a;“当初买房子&#xff0c;觉得这辈子安稳了。”结果一算账&#xff0c;心都凉了。年轻时有没有赚到钱&#xff0c;基本定了你后半生的财务轨迹。不是吓唬你&#xff0c;就是这么现实。年轻能攒下钱的&#xff0c;往往…

作者头像 李华
网站建设 2026/5/9 0:54:43

昆仑新能源冲刺港股:9个月营收10亿亏14万 郭营军控制38%股权

雷递网 雷建平 2月1日昆仑新能源材料技术&#xff08;宜昌&#xff09;股份有限公司&#xff08;简称&#xff1a;“昆仑新能源”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。昆仑新能源曾在2023年6月向深交所递交招股书&#xff0c;但2024年3月撤回了上市申请&a…

作者头像 李华
网站建设 2026/5/5 2:45:58

为什么你的代码能力越强,反而在公司越“不存在“?

你见过这样的开发者吗&#xff1f;代码质量顶级&#xff0c;日更无虚&#xff0c;issue 秒杀&#xff0c;但升职加薪的时候&#xff0c;却始终轮不到他。这不是能力问题&#xff0c;这是能见度问题。被隐形的优秀工程师这是一个有趣的悖论。我见过太多这样的开发者&#xff1a;…

作者头像 李华