需求:”ahg,,djks..bvagav?vftk”获取该字符串中字母出现的次数
希望打印结果:a(3)b(1)d(1)f(1)g(2)h(1)j(1)k(2)s(1)t(1)v(3)
通过打印结果发现每一个字母都有对应的次数,说明了字母和次数之间有映射关系。所以可以选择map集合,因为map集合中的存放就是映射关系。
思路:
- 将字符串转换成字符数组。因为要对每个字母进行操作。
char[] chs=str.toCharArray();
- 定义一个map集合,因为打印结果的字母有序,所以使用TreeMap.
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
- 遍历字符数组
将每一个字母作为键去查map集合。如果返回null,将该字母和1存入map集合;如果返回不是null,说明该字母在map集合中已经存在并有对应的次数,,那么就获取该次数并进行自增,然后将该字母和自增后的次数存入map集合,覆盖原来键所对应值。 - 将map集合中的数据变成指定的字符串形式返回。
“`
import java.util.*;
public class TreeMapTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s=charCount("ahg,,djks..bvagav?vftk");
System.out.print(s);
}
public static String charCount(String str)
{
char[] chs=str.toCharArray();
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
int count=0;
for(int x=0;x<chs.length;x++)
{
if(!(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z'))
continue;
Integer value=tm.get(chs[x]);
if(value!=null)
count=value;
count++;
tm.put(chs[x], count);
count=0;
/*
if(value==null)
{
tm.put(chs[x], 1);
}
else
{
value=value+1;
tm.put(chs[x], value);
}
*/
}
//System.out.println(tm);
StringBuilder sb=new StringBuilder();
Set<Map.Entry<Character,Integer>> entry=tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it=entry.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> me=it.next();
Character key=me.getKey();
Integer value=me.getValue();
//System.out.print(key+"("+value+")");
sb.append(key+"("+value+")");
}
return sb.toString();
}
}
运行结果: