问题描述
"fdgavcbsacdfs" 获取该字符串中,每一个字母出现的次数。
要求打印结果是:a(2)b(1)...;
容器的选择
由于字母和次数之间存在着映射的关系。而且这种关系很多。
很多就需要存储,能存储映射关系的容器有数组和Map集合。
关系一方式有序编号吗?没有!
那就是使用Map集合。 又发现可以保证唯一性的一方具备着顺序如 a b c ...
所以可以使用TreeMap集合。
算法思想
1,因为操作的是字符串中的字母,所以先将字符串变成字符数组。
2,遍历字符数组,用每一个字母作为键去查Map集合这个表。 如果该字母键不存在,就将该字母作为键 1作为值存储到map集合中。如果该字母键存在,就将该字母键对应值取出并+1,在将该字母和+1后的值存储到map集合中,键相同值会覆盖。这样就记录住了该字母的次数.
3,遍历结束,map集合就记录所有字母的出现的次数
实现代码
public static void main(String[] args) {
System.out.println("请输入字符串:");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
HashMap<Character,Integer> hm = new HashMap<Character,Integer>();
for(int i=0;i<str.length();i++)
{
//取出字符串中的每个字符与表进行比较
if(hm.containsKey(str.charAt(i)))
{
int count = hm.get(str.charAt(i));
count++;
hm.put(str.charAt(i),count);
}
else
hm.put(str.charAt(i),1);
}
//通过迭代来得到题目所要求的格式
Iterator<Character> it = hm.keySet().iterator();
while (it.hasNext())
{
Character key = it.next();
Integer value = hm.get(key);
System.out.print(key+"("+value+")");
}
}