--------------------android培训、java培训、期待与您交流! ---------------------
/*
练习:“kdsafkhgjasfjkldsj” 获取该字符串中的字母出现的次数。
希望打印结果: a(1)b(2)。。。。。
发现,每一个字母都有对应的次数,说明字母和数字之间有映射关系。
发现有映射关系时,可以选择map集合 ,因为map集合中存放的就是映射关系。
思路:1. 将字符串转换成字符数组,因为要对每一个之母进行操作。
2. 定义一个map集合,因为打印结果的是字母有顺序,所以使用 treemap集合。
3.遍历字符数组。将每一个字母作为键去查map集合。
如果返回null,就将该字母和1存到 map集合中。
如果返回不是null,说明该字母在map集合中已经存在并且已有对应次数。
那么就取出该次数并进行自增,然后将该字母和自增后的次数存入到map集合中。覆盖调用原来键所对应的值。
4.将map集合中的数据变成指定字符串形式返回。
*/
import java.util.*;
class MapTest
{
public static void main(String[] args)
{
System.out.println(charCount("dkf,./-*jkdfj,./34dkfi,./*tjkfndi"));
}
public static String charCount(String s){
char[] chs = s.toCharArray();//定义一个字符数组用于接收把传入的字符串变成字符数组。
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//定义一个Map集合用于接收字符和出现次数关系的映射关系。
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;//如果遍历到不是字母,就停止执行这个字符,而进行下一个字符。
//System.out.println(tm.get(chs[x]));
Integer value = tm.get(chs[x]);// int get(key):把遍历到的字符当做键,来查询 tm 集合中是否存在该键,如不存在,
//则返回 null ,如存在,则返回该键对应的 int 型的值。
if(value!=null)
count = value;
count++; //这是一种方式,如果没有该键,标记自加为 1 ,将该键和自加后的 1 存入map集合,记为该字母(键)出现
tm.put(chs[x],count);// 一次。有过有该键,就将该键对应的值(int型)取出,并赋给标记,后标记自加一次,将该
count = 0;// 键和自加后的标记,存入map集合。
/* if (value==null)
{ 这时令一种方式,较上面的好理解。如果返回的值为空,就把该键和 1 存入集合。
tm.put(chs[x],1); 如果返回的不为空,就把该键和自加后的值存入集合。
}
else{
value += 1; 先定义 Map 集合并算出字符和出现次数的关系,用map 集合记录住。
tm.put(chs[x],value); 再用 Map 集合的取出方式取出关系,并转成字符串打印出来。
}*/
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();//定义一个 StringBuilder 字符串缓冲区,用于记录字符和次数关系的字符串。
// 用StringBuilder是因为他是jdk 1.5 以后出现的代替 StringBuffer.
//StringBuilder 较 String 是可变长度的,支持各种数据类型。最终会通过
//toString 来变成字符串。
Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();// Map集合的取出方式之二,第一种是 keySet 只可以取出键,
//然后再用键来通过 get 获取对应的值。
// 这是将映射关系取出存入到 Set 集合中,Set的泛型狠特别。
Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();//迭代器要和Set集合的泛型相同,多态的写法,建立父
while (it.hasNext()) //类型的子类对象。
{
Map.Entry<Character,Integer> me = it.next();//next方法迭代出来的也是 Map.Entry 对象,所以这样写。
Character ch = me.getKey();//获取 Map 集合中的键。
Integer value = me.getValue();//获取 Map 集合中的值。 Map.Entry()特有方法。
sb.append(ch+"("+value+")");//将获取到的东西,存入到 缓冲区 中。
}
return sb.toString();//调用缓冲区的toString 方法,并返回。因为本 函数 写的返回值类型是 String。
}
}
-------------------android培训、java培训、期待与您交流! --------------------