TreeMap原理(上)

阅读:238

目录介绍

  • 01.TreeMap特点
  • 02.何时用TreeMap
  • 03.TreeMap简单使用
  • 04.案例训练

01.TreeMap特点

  • TreeMap集合结构特点
    • 键的数据结构是红黑树,可保证键的排序和唯一性
    • 排序分为自然排序和比较器排序,如果使用的是自然排序,对元素有要求,要求这个元素需要实现 Comparable 接口
    • 线程是不安全的效率比较高
    public TreeMap(): 自然排序
    public TreeMap(Comparator<? super K> comparator):  使用的是比较器排序
    

02.何时用TreeMap

  • 之前已经学习过HashMap和LinkedHashMap了,HashMap不保证数据有序,LinkedHashMap保证数据可以保持插入顺序,而如果我们希望Map可以保持key的大小顺序的时候,我们就需要利用TreeMap了。

03.TreeMap简单使用

  • 普通添加数据
    • 代码如下所示
      TreeMap<Integer, String> tmap = new TreeMap<Integer, String>();
      tmap.put(1, "语文");
      tmap.put(3, "英语");
      tmap.put(2, "数学");
      tmap.put(4, "政治");
      tmap.put(5, "历史");
      tmap.put(6, "地理");
      tmap.put(7, "生物");
      tmap.put(8, "化学");
      for(Entry<Integer, String> entry : tmap.entrySet()) {
          System.out.println(entry.getKey() + ": " + entry.getValue());
      }
      

    • 使用红黑树的好处是能够使得树具有不错的平衡性,这样操作的速度就可以达到log(n)的水平了。
  • TreeMap集合键是String值是String的案例
      • TreeMap: 键的数据结构是红黑树,可保证键的排序和唯一性
    public static void main(String[] args) {
        /**使用TreeMap集合存储元素,键是Integer类型 , 值是String类型*/
        // 创建TreeMap集合对象
        TreeMap<Integer , String> hm = new TreeMap<Integer , String> () ;
        // 添加元素
        hm.put(23, "乔丹") ;
        hm.put(24, "科比") ;
        hm.put(1, "麦迪") ;
        hm.put(3, "艾弗森") ;
        // 遍历
        Set<Entry<Integer,String>> entrySet = hm.entrySet() ;
        for(Entry<Integer,String> en : entrySet) {
            // 获取键
            Integer integer = en.getKey() ;
            // 获取值
            String value = en.getValue() ;
            // 输出
            System.out.println(integer + "---" + value);
        }
    }
    

  • TreeMap集合键是Student值是String的案例
    public static void main(String[] args) {
        /**
         * 需求: 使用TreeMap集合存储元素,键是Student类型, 值是String类型
         * 按照年龄大小进行排序
         */
        // 创建自定义对象
        Student s1 = new Student("郭靖" , 24) ;
        Student s2 = new Student("杨过" , 18) ;
        Student s3 = new Student("乔峰" , 25) ;
        Student s4 = new Student("令狐冲" , 16) ;
        // 创建TreeMap集合对象
        TreeMap<Student ,String> tm = new TreeMap<Student , String>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s1.getAge() - s2.getAge() ;
                int num2 = (num == 0) ? s1.getName().compareTo(s2.getName()) : num ;
                return num2;
            }
        }) ;
        // 添加元素
        tm.put(s1, "哈哈") ;
        tm.put(s2, "呵呵") ;
        tm.put(s3, "打酱油") ;
        tm.put(s4, "给力") ;
        // 遍历
        Set<Entry<Student,String>> entrySet = tm.entrySet() ;
        for(Entry<Student,String> en : entrySet) {
            // 获取键
            Student student = en.getKey() ;
            // 获取值
            String value = en.getValue() ;
            // 输出
            System.out.println("key: [name: " + student.getName() + " , age: " + student.getAge() + "] , value: " + value );
        }
    }
    

04.案例训练

  • "aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
    • "aababcabcdabcde" 按照键值对的形式存储到TreeMap集合中
    • 分析:
    • 1,遍历字符串,获取每一个字符,然后将当前的字符作为键 , 上map集合中查找对应的值
    • 2,如果返回的值不是null 对值进行+1 , 在把当前的元素作为键 , 值是+1以后的结果存储到集合中
    • 3,如果返回的是是null , 不存在 , 就把当前遍历的元素作为键 , 1 作为值,添加到集合中
  • 代码如下
    public static void main(String[] args) {
        // 定义字符串
        String s = "aababcabcdabcde" ;
        // 创建TreeMap集合对象
        TreeMap<Character , Integer> tm = new TreeMap<Character , Integer>() ;
        // 遍历字符串
        for(int x = 0 ; x < s.length() ; x++) {
            // 获取当前索引出对应的字符
            char ch = s.charAt(x) ;
            // 找值
            Integer value = tm.get(ch) ;
            // 判断
            if(value == null) {
                tm.put(ch, 1) ;
            }else {
                value += 1 ;
                tm.put(ch, value) ;
            }
        }       
        // 遍历Map集合按照指定的形式拼接字符串
        StringBuilder sb = new StringBuilder() ;
        Set<Entry<Character,Integer>> entrySet = tm.entrySet() ;
        for(Entry<Character,Integer> en : entrySet) {
            // 获取键
            Character key = en.getKey() ;
            // 获取值
            Integer value = en.getValue() ;
            // a(5)b(4)c(3)d(2)e(1)
            // 拼接
            sb.append(key).append("(").append(value).append(")") ;
        }
        // 把sb转换成String
        String result = sb.toString() ;
        // 输出
        System.out.println(result);
    }

赞赏支持


精彩留言

发表评论