- /*
- * 集合的一些小技巧
- * 需要唯一吗?
- * 需要:Set
- * 需要制定顺序吗?
- * 需要:TreeSet
- * 不需要:HashSet
- * 但是想要一个和存储一致的顺序(有序)LinkedHashSet
- * 不需要:List
- * 需要频繁操作吗?
- * 需要:LinkedList
- * 不需要:ArrayList
- *
- *如何记录每一个容器的结构和所属体系呢?
- *看名字:
- *List
- * |--ArrayList
- * |--LinkedList
- *Set:
- * |--HashSet
- * |--TreeSet
- *后缀名就是该集合所属的体系。
- *前缀名就是该集合的数据结构。
- *看到Array:就要想到数据。就要想到查询快,有角标。
- *看到Link:就要想到链表,就要想到增删快,就要想到add,get,remove+first,last方法
- *看到Hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode方法和equals方法
- *看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable,Comparator.
- *而且,通常这些常用的集合都是不同步的。
- */
- /*
- * 练习Map集合的使用
- * 需求:
- * "fdgawcbsacdfs"获取该字符串每一个字母出现的次数,要求打印的结果是:a(2)b(1)
- * 思路:
- * 1)对于结果的分析发现,字母和次数之间存在这映射关系,而且这种关系很多。
- * 2)既然很多就要存储,能存储关系的映射容器有数组和Map集合。
- * 3)关系一方是有序的编号吗? 不是
- * 4)那就是使用Map集合。又发现可以保证唯一性的一方具备着顺序如,a,b,c...
- * 所以可以使用TreeMap集合
- * 分析:
- * 这个集合最终应该存储的是字母和次数的对应关系。
- * 1)因为操作的是字符串的字幕,所以先将字符串变成字符数组
- * 2)遍历字符数组,用每一个字母作为键去查Map集合这个表。
- * 2.1)如果字母键不存在,就将该字母作为键,1作为值存储到Map集合中。
- * 2.2)如果该字母键存在,就将该字母键对应的值取出并+1,再将该字母和+1后的值存储到Map集合中。
- * 2.3)键相同,值会覆盖。这样就记录住了该字母的次数。
- * 3)遍历结束,Map集合就记录所有的字幕出现的次数
- */
- public class MapDemo {
- public static void main(String[] args) {
- String str = "fdgawcbsacdfs";
- String s = gerCharCounts(str);
- System.out.println(s);
- }
- public static String gerCharCounts(String str) {
- //1.将字符串变成字符数组
- char[] chs = str.toCharArray();
- //2.定义一个Map集合
- Map<Character, Integer> map = new TreeMap<Character,Integer>();
- //3.将数组中的字母遍历到集合中合
- for(int i=0;i<chs.length;i++){
- //作为键值去查Map表
- Integer value = map.get(chs[i]);
- int count = 0;
- //判断是否为空
- if(value !=null){
- count = value;
- }
- count++;
- map.put(chs[i], count);
- }
- return mapToStirng(map);
- }
- private static String mapToStirng(Map<Character, Integer> map) {
- StringBuilder sb = new StringBuilder();
- //调用遍历器遍历
- Iterator<Character> it = map.keySet().iterator();
- while(it.hasNext()){
- Character key = it.next();
- Integer value = map.get(key);
- sb.append(key+"("+value+")");
- }
- return sb.toString();
- }
- }