news 2026/4/25 13:00:04

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/18 2:34:31

网络安全毕设简单的开题答疑

0 选题推荐 - 大数据篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应…

作者头像 李华
网站建设 2026/4/23 22:49:27

1454万,全域数字化转型项目

近日&#xff0c; 银川市数据局发布2026年2&#xff08;至&#xff09;3月政府采购意向。银川市数据局全域数字化转型小切口应用场景试点示范项目&#xff0c;预算金额&#xff1a;1454万元。一、项目信息&#xff1a;项目名称&#xff1a;银川市数据局全域数字化转型小切口应用…

作者头像 李华
网站建设 2026/4/18 2:15:18

计算机毕设java社团管理系统 基于Java的社团综合管理系统设计与实现 Java技术驱动的社团信息化管理平台开发

计算机毕设java社团管理系统4r2p59&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网技术的飞速发展&#xff0c;社团管理的信息化需求日益增长。传统的社团管理模式面…

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

计算机毕业设计springboot校园失物招领系统 基于Spring Boot的高校失物数字化管理系统 智慧校园物品遗失与寻回服务平台

计算机毕业设计springboot校园失物招领系统84md6cz6 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着高校规模扩大和校园活动日益频繁&#xff0c;师生物品遗失事件频发&…

作者头像 李华