练习:“fdgavcbsacdfs”获取该字符串中每一个字母出现的次数。
分析:字母和次数之间存在着映射关系,而且这种关系很多,就需要能存储映射关系的容器:数组和Map集合。关系中一方如果是有序编号,用数组;否则map集合。本例中使用Map集合。
又发现可以保证唯一性的一方具备顺序如a、b、c......所以使用TreeMap集合。
这个集合中最终应该存储的是字母和次数的对应关系:
1、因为操作的是字符串中的字母,所以先将字符串变成字符数组。
2、遍历字符数组,用每一个字母作为键去查Map集合这个表,如果该字母键不存在,就将该字母作为键,1作为值存储到map集合中;如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中,键相同值会覆盖,这样就记录了该字母的次数。
3、遍历结束,map集合就记录了所有字母出现的次数。
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class MapTest{
public static void main(String[] args){
String str="fdgavcbsacdfs";
String s=getCharCount(str);
System.out.println(s);
}
public static String getCharCount(String str){
//将字符串变成字符数组
char[] chs=str.toCharArray();
//定义map集合表
Map<Character,Integer> map=new TreeMap<Character,Integer>();
for(int i=0;i<chs.length;i++){ //遍历
//将数组中的字母作为键去查map表
Integer value=map.get(chs[i]);
//判断值是否为null
/*
if(value==null){
map.put(chs[i],1);
}else{
map.put(chs[i],value+1);
}
*/
//以上代码可用下面的替换:
int count=1;
if(value!=null) {
count=value+1;
}
map.put(chs[i],count);
}
return mapToString(map);
}
private static String mapToString(Map<Character,Integer> map){
StringBuilder sb=new StringBuilder();
Iterator<Character> it=map.keySet().iterator();
while(it.hasNext()){
Character key=it.next();
Integer value=map.get(key);
sb.append(key+"("+value+")");
}
<span style="white-space:pre"> </span>return sb.toString();
}
}
运行结果: