如何使用HashMap统计字符串字符时忽略空格、大写字母和标点?
字符统计HashMap实现方案
嘿,你的思路完全没问题!用HashMap来存储字符和对应的出现次数是最直接的方式,我帮你把代码补全,还分享两种实现方式——一种是基础版适合理解原理,另一种是Java 8+的简化写法。
基础实现(适合理解逻辑)
这个版本和你原来的代码思路一致,补全了缺失的分支,还做了小优化避免重复调用charAt():
public void result(String sentence) { // 用菱形语法简化泛型声明(Java 7+支持) HashMap<Character, Integer> mp = new HashMap<>(); for (int i = 0; i < sentence.length(); i++) { char currentChar = sentence.charAt(i); if (mp.containsKey(currentChar)) { // 字符已存在,取出当前计数加1后存回去 int currentCount = mp.get(currentChar); mp.put(currentChar, currentCount + 1); } else { // 字符第一次出现,初始化计数为1 mp.put(currentChar, 1); } } // HashMap的toString()方法刚好会输出你要的{a=2, s=2, k=1,...}格式 System.out.println(mp); }
Java 8+简化写法(更紧凑)
如果你的项目用的是Java 8及以上,可以用merge()方法一行搞定计数逻辑,代码更简洁:
public void result(String sentence) { HashMap<Character, Integer> mp = new HashMap<>(); // 把字符串转成字符数组遍历,更直观 for (char c : sentence.toCharArray()) { // merge方法逻辑:若key不存在则存1,若存在则把旧值和1相加 mp.merge(c, 1, Integer::sum); } System.out.println(mp); }
额外小提示
- 如果你需要忽略大小写(比如把'A'和'a'算同一个字符),可以在存入前统一转成小写/大写:
char currentChar = Character.toLowerCase(sentence.charAt(i)); - HashMap的输出是无序的,如果需要按字符顺序输出,可以换成
TreeMap,输出就会按字符的自然排序展示啦。
内容的提问来源于stack exchange,提问作者tyxod
相关产品推荐
相关产品推荐

