题干:
获取自定义文本上每个字符出现的次数
提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件
列入:aabbccddwab ----->a3b3c2d2w1
分析:
- 我们可以把结果分成几个部分来看: a(5),b(4),c(3),d(2),e(1)
- 每一个部分可以看成是:字符和字符对应的次数组成
- 这样的数据,我们可以通过HashMap集合来存储,键是字符,值是字符出现的次数
注意:键是字符,类型应该是Character;值是字符出现的次数,类型应该是Integer
思路:
- 键盘录入一个字符串
- 创建HashMap集合,键是Character,值是Integer
- 遍历字符串,得到每一个字符
- 拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储
如果返回值不是null:说明该字符在HashMap集合中存在,把该值加1,然后重新存储该字符和对应的值
- 遍历HashMap集合,得到健和值,按照要求进行拼接
- 输出拼接结果
可恶!居然报错,空指针异常NullPointerException
找到原因了,原来是没有else语句(应该是写注释的时候不小心写漏了,我以为我写了,但实我没有:D)
改过来以后
完整代码:
package com.B.IOStream_14.IODemo;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
//2. 获取自定义文本上每个字符出现的次数
//提示:遍历文本的每一个字符;字符及出现的次数保存在Map中;将Map中数据写入文件
//列入:aabbccddwab ----->a3b3c2d2w1
public class A2Map {
private static Object Character;
public static void main(String[] args) {
// 键盘输入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String line = sc.nextLine();
// 创建TreeMap集合(有序的,如果是HashMap就是无序的),键是Character,值是Integer
TreeMap<Character, Integer> map = new TreeMap<Character, Integer>();
//遍历字符串
for (int i = 0; i < line.length(); i++) {
char key = line.charAt(i); //将字符作为键
//拿得到的每一个字符作为键到TreeMap集合中去找对应的值,看其返回值
Integer value = map.get(key);
if (value == null) {
//如果返回值是null:说明该字符在TreeMap集合中不存在,就把该字符作为键,1作为值存储
map.put(key, 1);
}else {
//如果返回值不是null:说明该字符在TreeMap集合中存在,把该值加1,然后重新存储该字符和对应的值
value++;
map.put(key, value);
}
}
//遍历TreeMap集合,得到键和值,按照要求进行拼接
StringBuilder sb = new StringBuilder();
// Set确保键的不重复
Set<Character> KeySet = map.keySet();
// 迭代器
for (Character key : KeySet) {
Integer value = map.get(key);
sb.append(key).append(value);
}
String result = sb.toString();
// 输出
System.out.println(result);
}
}
结果:
请输入字符串:
wsgdgagdgdg
a1d3g5s1w1
进程已结束,退出代码 0