• 题目不考虑空格和特殊字符的字数,那么可以先对字符串中的空格和特殊字符进行操作,这里可以使用String类提供的字符串替换方法replaceAll()将空格以及特殊字符转化为空,这个函数的参数有regex和replacement两个,含义分别是匹配此字符串的正则表达式和用来替换每个匹配项的字符串。那么在这里,regex参数就可以写为匹配所有的非a-z和A-Z的字符,将匹配到的的字符替换为空字符串,具体写法参考如下代码:
line = line.replaceAll("[^a-zA-Z]", "");
  • 利用map集合的key不能重复这一点,将处理过的字符串拆分成一个个的字符,拆分的方式可以是遍历这个字符串,使用charAt(index)函数得到字符串每一位上的字符,把这些字符作为key存入map中,然后用value来代表这个key在字符串中出现的次数。若map中包含以这个字符作为key的键值对,则将key对应的value值加一,否则将这个字符作为key存入map中,并将他的value设为1。此处的具体逻辑参考如下:
for (int i = 0; i < line.length(); i++) {
   char c = line.charAt(i);
   if (map.containsKey(c)) {
       map.put(c, map.get(c) + 1);
   } else {
       map.put(c, 1);
   }
}

附完整代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
 line = line.replaceAll("[^a-zA-Z]", "");
for (int i = 0; i < line.length(); i++) {
    char c = line.charAt(i);
    if (map.containsKey(c)) {
        map.put(c, map.get(c) + 1);
    } else {
        map.put(c, 1);
    }
}
        //write your code here......
      

        Set<Map.Entry<Character, Integer>> entrys = map.entrySet();
        for (Map.Entry<Character, Integer> entry : entrys) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
}