黑马程序员---关于取出一个字符串中字母个数的题目分析

题目和分析如下:

/**
 *  1、 取出一个字符串中字母出现的次数。如:字符串:"abcdekka27qoq" ,
 * 输出格式为:a(2)b(1)k(2)...
 * 
 * 分析:要获得字符串中字母出现的次数,而且字母是有自然顺序的
 * 基本思想就是:把字符串中的每一个字母都挨个取出来,如果还没有统计到这个字母,就把这个字母的个数变成1,如果已经统计到这个字母
 * 就把这个字母的个数加1,如何让字母有序呢?实现有自然顺序的方式是内部存在的比较方法,或者使用比较器
 * 
 * 既然是多个字符组成的字符串,而且要考虑挨个拿出来,所以要考虑使用容器,也就是数组或集合
 * 究竟是使用数组还是集合呢?
 * 这就需要考虑数组和集合的区别
 * 数组是什么?
 * 数组是容器,用来存储单一数据类型,数组长度是固定的,
 * 集合也是容器,不过集合的使用范围更广,集合是用来存储对象的,变长,可以存储不同的数据类型
 * 数组可以做么?可以做应改怎么做?
 * 首先想要获取其中的每一个元素,就需要先把字符串转成字符数组,然后才能比较其中的值 
 * 转成数组后,如何比较或者获取?又如何存放比较后的元素呢?难道要在创建几个数组么?
 * 是不太现实的,因为不知到究竟会有多少个,也就是说,数组根本不知道应该创建多长,感觉做到这里思路已经不太清晰了
 * 那么使用集合来做吧
 * 为什么要使用集合呢?
 * 首先,集合种的TreeSet或TreeMap都提供了自动排序功能
 * 然后,数组能做的,集合都能做
 * 那么使用集合种的那一个实现类呢?
 * 既然是统计出现的次数,实际上分开来看,也就是统计不重复元素的个数
 * 既然不重复,那么就考虑set或map,map中的元素都是键值对应的,键不可重复
 * 又因为需要对其中的元素进行自然排序,所以需要使用hash或者Tree
 * hash获得的是按照hash表获取的元素顺序,并不能保证有序,所以需要使用Tree
 * 那么使用TreeSet还是TreeMap?
 * 看这个题目,是不是就代表不重复的元素字符,而值正是可以改变的个数
 * 所以使用TreeMap是最好最合适的选择
 * 
 * 那么使用TreeSet如何做?
 * 第一步:获取字符串并把它转换成字符数组
 * 第二步:创建TreeSet集合
 * 第三步:使用get(k)方法,判断集合种是否有该字符,如果有,那么就让值加1,如果没有,就把这个键存到集合种,值为1
 * 第四步:遍历集合TreeMap,得到值和键,输出如题所需的格式
 * 
 * */


代码实现

  1. public class Test1 {  
  2.     public static void main(String[] args) {  
  3.         String s = "abcdekka27qoq";  
  4.         // 将字符串转成字符数组  
  5.         char[] ch = s.toCharArray();  
  6.         // 建立一个新的集合TreeMap  
  7.         TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();  
  8.         int value = 1;  
  9.         // 遍历字符数组,判断集合中是否存在  
  10.         for (int i = 0; i < ch.length; i++) {  
  11.             value = 1;  
  12.             // 通过传递的键,获取值和null比较,判断该键是否存在于集合中  
  13.             if (tm.get(ch[i]) == null) {  
  14.                 tm.put(ch[i], value);  
  15.             } else {  
  16.                 tm.put(ch[i], ++value);  
  17.             }  
  18.         }  
  19.         method_2(tm);  
  20.     }  
  21.   
  22.     // 遍历TreMap,第一种方式,keySet();  
  23.     public static void method(TreeMap<Character, Integer> tm) {  
  24.         // 创建hashSet,存储键  
  25.         // Set<Character> set =new HashSet<Character>();  
  26.         Set<Character> set = tm.keySet();  
  27.         // 遍历set  
  28.         for (Iterator<Character> it = set.iterator(); it.hasNext();) {  
  29.             char c = it.next();  
  30.             int i = tm.get(c);  
  31.             System.out.print(c + "(" + i + ")");  
  32.         }  
  33.     }  
  34.   
  35.     // 第二种方法,使用键值关系  
  36.     public static void method_2(TreeMap<Character, Integer> tm) {  
  37.         // 获取键值关系  
  38.         Set<Map.Entry<Character, Integer>> set = tm.entrySet();  
  39.         for (Map.Entry<Character, Integer> me : set) {  
  40.             char key = me.getKey();  
  41.             int value = me.getValue();  
  42.             System.out.print(key + "(" + value + ")");  
  43.         }  
  44.     }  
  45. }  
public class Test1 {
	public static void main(String[] args) {
		String s = "abcdekka27qoq";
		// 将字符串转成字符数组
		char[] ch = s.toCharArray();
		// 建立一个新的集合TreeMap
		TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
		int value = 1;
		// 遍历字符数组,判断集合中是否存在
		for (int i = 0; i < ch.length; i++) {
			value = 1;
			// 通过传递的键,获取值和null比较,判断该键是否存在于集合中
			if (tm.get(ch[i]) == null) {
				tm.put(ch[i], value);
			} else {
				tm.put(ch[i], ++value);
			}
		}
		method_2(tm);
	}

	// 遍历TreMap,第一种方式,keySet();
	public static void method(TreeMap<Character, Integer> tm) {
		// 创建hashSet,存储键
		// Set<Character> set =new HashSet<Character>();
		Set<Character> set = tm.keySet();
		// 遍历set
		for (Iterator<Character> it = set.iterator(); it.hasNext();) {
			char c = it.next();
			int i = tm.get(c);
			System.out.print(c + "(" + i + ")");
		}
	}

	// 第二种方法,使用键值关系
	public static void method_2(TreeMap<Character, Integer> tm) {
		// 获取键值关系
		Set<Map.Entry<Character, Integer>> set = tm.entrySet();
		for (Map.Entry<Character, Integer> me : set) {
			char key = me.getKey();
			int value = me.getValue();
			System.out.print(key + "(" + value + ")");
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值