字母出现频率统计

it2023-09-02  64

题目内容:

从键盘输入一行中英文混合的文字,统计其中出现的每个英文字母的频率并依字母表顺序,依次输出统计结果,统计时忽略字母大小写的区别。

输入格式:

一行中英文混合的文字

输出格式:

输出每个字母及其出现次数,字母之间用2个空格分隔。

输入样例:

我们学习Java,we work very hard!

输出样例:

a=3 d=1 e=2 h=1 j=1 k=1 o=1 r=3 v=2 w=2 y=1

思路

1.把不是英文字符的给去掉

输入字符串里包含中文和英文,我们需要过滤掉中文只留下英文

可以使用正则来进行字符串的检索 Pattern pattern = Pattern.compile("^[a-zA-Z]+$"); Matcher matcher = pattern.matcher("ewernwenflsd"); System.out.println(matcher.find());

正则^[a-zA-Z]+$意味着以[a-zA-z]开头匹配1次或多次并且以此结尾。用来匹配完全由英文组成的字符串。 代码:

String s = "Df32f__ f/;'a一些文字".replaceAll("[^a-zA-Z]",""); System.out.println(s);

通过String#replaceAll方法,将满足正则的字符替换成""来以此来过滤非英文的字符。

使用ASCII码判断是否是英文 for (char c : input.toCharArray()) { if ((c >= 'a' && c <= 'z')) { // 一些代码 } }

以上代码会检测每一个字符的ASCII是否在a和z之间,'a’和’z’可以分别等价与97和122。

2.统计字符并且按照字母顺序输出

保留完英文字符,并且将他们全部转化为小写之后,我们需要想办法让他们按照顺序输出,可以通过数组保存,以ASCII或者字母的顺序作为下表,到时候按照顺序遍历输出即可。 或者更加聪明的方法,使用有序集合TreeMap来存储,TreeMap底层是一棵红黑树,对于集合的改变都会按照顺序存储

Map<Character, Integer> map = new TreeMap<Character, Integer>(); for (char c : input.toCharArray()) { if ((c >= 'a' && c <= 'z')) { Integer i; map.put(c, (i = map.get(c)) == null ? 1 : i + 1); } } // ...

完整代码:

import java.util.Map; import java.util.Scanner; import java.util.TreeMap; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); input = input.toLowerCase(); Map<Character, Integer> map = new TreeMap<Character, Integer>(); for (char c : input.toCharArray()) { if ((c >= 'a' && c <= 'z')) { Integer i; map.put(c, (i = map.get(c)) == null ? 1 : i + 1); } } for (Map.Entry<Character, Integer> entry : map.entrySet()) { System.out.print(entry.getKey() + "=" + entry.getValue() + " "); } } }
最新回复(0)