统计字符串中每个字符出现的次数
键盘录入一个字符串,要求统计字符串中每个字符串出现的次数 举例:键盘录入"aaaaabbbbcccdde"则会在控制台输出"a(5)b(4)c(2)d(2)e(1)"
分析: 1、我们可以把结果分成几个部分来看:a(5),b(4),c(2),d(2),e(1) 2、每一个部分可以看成是:字符和字符对应的次数组成,其中的字符和次数可以分别作为键和值 3、这样的数据,我们可以通过HashMap集合来存储,键是字符,值是字符出现的次数 注意:键是字符,类型不能写成char,要写成char对应的包装类类型Character。值是字符出现的次数,类型不能写int,要写int对应的包装类类型Integer
思路: 1、键盘录入一个字符串 2、创建HashMap集合,键是Character类型,值是Integer类型 3、遍历字符串,得到每一个字符 4、拿得到的每一个字符作为键,再到HashMap集合中去找对应的值,看其返回值 (1)如果找的过程中返回null,说明该键对应的值(字符)不存在,就把该字符作为键,1作为值存储 (2)如果返回值不是null,说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符和对应的值,注意重新存储会出现键相同值覆盖 5、遍历HashMap集合,得到键和值,按照要求进行拼接 6、输出结果
统计字符串中每个字符出现次数的练习
xxxxxxxxxx
package ch17;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
//注意使用HashMap集合,是无序的
//如果想要输出有序的话,就把22行改一下
public class a_10_1测试 {
public static void main(String[] args) {
while (true) { //也可以去掉这里的while
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入任意长度的字符串:");
String line = sc.nextLine();
//创建HashMap集合,键是Character类型,值是Integer类型
//HashMap<Character, Integer> hm = new HashMap<Character, Integer>(); //无序
TreeMap<Character, Integer> hm = new TreeMap<Character, Integer>(); //有序(按字母顺序排序,不是按输入顺序排序)
//上面那行没导包的话,要按Alt+Enter完成导包
//遍历字符串,得到每一个字符
for (int i = 0; i < line.length(); i++) {
char key = line.charAt(i); //这里拿到的字符是作为键来使用
//拿得到的每一个字符作为键,再到HashMap集合中去找对应的值,看其返回值
Integer value = hm.get(key);//这里的key原本是基本数据类型,在这行会自动装箱为引用数据类型
//判断值是不是为null
if (value == null) {
//如果返回的是null,说明这个值在HashMap集合中不存在。则存储一次这个字符,为1
hm.put(key, 1); //这行负责存储,这行也有自动装箱的动作
} else { //如果返回的不是null,说明该字符在HashMap集合中存在
value++;//这行会进行自动拆箱的操作
//重新存储一下该字符
hm.put(key, value);
//就完成了字符次数的统计
}
}
//遍历HashMap集合,得到键和值,按照要求进行拼接
StringBuilder sbd = new StringBuilder();//用于等下的拼接
//遍历HashMap集合
Set<Character> keySet = hm.keySet();
//遍历键的集合
for (Character key : keySet) {
Integer value = hm.get(key);//根据键找到对应的值
//拼接
sbd.append(key).append("(").append(value).append(")");
}
//此时的sbd里面就是我们想要的数据,但是数据是StringBuilder类型的,所以需要做一次转换
String result = sbd.toString();
//输出结果
System.out.println(result);
}
}
}