在学习Map时做了一道有意思的练习题,在这里记录一下。
题目的大概意思是:
输入任意一串字符串,如aaabbbccsghedkok,统计字符串中每一个字符出现的次数,输出结果的形式为:a(1)b(2)…。
思路:
字母和次数之间存在映射关系,所以使用map进行存储。输出的字母之间是有顺序的,所以采用TreeMap(这里补充一下知识点:Map接口的实现类有两种:HashMap和TreeMap。HashMap的底层数据结构为哈希表,能够保证元素的唯一性。TreeMap的底层数据结构是二叉树,不仅能保证元素的唯一性,还可以进行排序)。
步骤:
- 因为操作的是字符串的字母,所以先将字符串变成字符数组;
- 遍历字符数组,用每一个字母作为键去查Map集合的表
如果字母键不存在,就将该字母作为键 1作为值存储到Map中
如果该字母键存在,就将该字母键对应的值取出再加1,再将该字母和对应的值存储到Map集合中。键相同值会覆盖。 - 遍历结束,Map集合中已经存储了映射关系。
存储的时候结果长度是可变的,所以不采用String,采用StringBuilder.
代码如下:
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class Test1 {
public static void main(String[] args) {
String str="aaabbbccsghedkok";
String s=getCharCount(str);
System.out.println(s);
}
private static String getCharCount(String str) {
//1.将字符串变成字符数组
char[] chs=str.toCharArray();
//2.创建一个map集合
Map<Character, Integer> map=new TreeMap<Character, Integer>(); //Map<char,int>这样是不对的,因为char与int是数据类型,而不是对象类型,所以用其包装类
//3.遍历
for(int i=0;i<chs.length;i++){
if(!(chs[i]>='a' && chs[i]<='z')){
continue; //如果不是字母则跳过
}
//如果传进来的键没有对应的值,则返回null
//将数组中的字母作为键去查找map表
Integer value=map.get(chs[i]);
/*int count=1;
//判断是否为空
if(value!=null){
count=value+1;
}
map.put(chs[i], count);*/
if(value==null){
map.put(chs[i],1); //字母第一次出现map中没有记录,所以输出为null,第一次出现设置count为1
}else{
map.put(chs[i],value+1);
}
}
return maptoString(map);//输出
}
private static String maptoString(Map<Character, Integer> map) {
StringBuilder sb=new StringBuilder();
Iterator<Character> iterator=map.keySet().iterator();
while(iterator.hasNext()){
Character key=iterator.next();
Integer value=map.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
}