关于取出一个字符串中字母个数的题目分析

来源:互联网 发布:sas软件的数据结构 编辑:程序博客网 时间:2024/05/14 04:50

题目和分析如下:

/**
 *  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,得到值和键,输出如题所需的格式
 * 
 * */


代码实现

public class Test1 {public static void main(String[] args) {String s = "abcdekka27qoq";// 将字符串转成字符数组char[] ch = s.toCharArray();// 建立一个新的集合TreeMapTreeMap<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();// 遍历setfor (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 0