黑马程序员->集合类 (3 代码练习

--------------------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培训、期待与您交流! --------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值