题目和分析如下:
/**
* 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();
- // 建立一个新的集合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 + ")");
- }
- }
- }
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 + ")");
}
}
}