Java:TreeMap集合探究

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:TreeMap集合探究相关的知识,希望对你有一定的参考价值。

文章目录

1.TreeMap集合

1.1 TreeMap集合概述和特点

  • TreeMap底层是红黑树结构, 这种实现提供保证log(n)的时间成本的containsKey,get,put和remove操作
  • 依赖自然排序或者比较器排序,对键进行排序
  • 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则

TreeMap继承关系

2. TreeMap综合案例

2.1 案例一:按照年龄(姓名)进行排序并遍历

代码需求:创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),学生属性姓名和年龄,按照年龄进行排序并遍历,要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序

2.1.1 代码实现

排序小技巧:

  • o1,o2:o1在前升序,o2在前降序
  • this,o:this在前升序,this在后降序。
package com.test;

import java.util.*;

class Student implements Comparable<Student>
    private String name;
    private int age;

    public Student() 
    

    public Student(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "Student" +
                "name='" + name + '\\'' +
                ", age=" + age +
                '';
    

    @Override
    public int compareTo(Student o) 
        //按照年龄进行排序 要比的o与当前对象  比的要大 放前面  先按照年龄降序  再按照名字降序
        int result = o.getAge() - this.getAge();
        //次要条件,按照姓名排序。
        return result == 0 ? o.getName().compareTo(this.getName()) : result;
    


public class TreeMapTest 
    public static void main(String[] args) 
        // 创建TreeMap集合对象
        TreeMap<Student,String> tm = new TreeMap<>();

        // 创建学生对象
        Student s1 = new Student("苏映雪",11);
        Student s2 = new Student("叶轻柔",22);
        Student s3 = new Student("莫妮倩",33);

        // 将学生对象添加到TreeMap集合中
        tm.put(s1,"太灵");
        tm.put(s2,"月兰");
        tm.put(s3,"天机");

        // 遍历TreeMap集合,打印每个学生的信息
        tm.forEach(
                (Student key, String value)->
                    System.out.println(key + "---" + value);
                
        );
    

2.2 案例二:统计字符串中每个字符出现的次数

案例需求:给定一个字符串,要求统计字符串中每个字符出现的次数。

举例: 给定字符串是“aababcabcdabcde”,在控制台输出: “a(5)b(4)c(3)d(2)e(1)”

2.2.1 代码实现

package com.test;

import java.util.*;

public class TreeMapTest2  
    public static void main(String[] args) 
        // 给定字符串
        String s = "aababcabcdabcde";
        // 创建TreeMap集合对象,键是Character,值是Integer
        TreeMap<Character,Integer> tm = new TreeMap<>();

        TreeMap<Character,Integer> treeMap = new TreeMap<>();
        // 遍历字符串:简写
        for (int i = 0; i < s.length(); i++) 
            char c=s.charAt(i);
            treeMap.put(c,treeMap.getOrDefault(c,0)+1);
        

        //遍历字符串,得到每一个字符
//        for (int i = 0; i < s.length(); i++) 
//            //c依次表示字符串中的每一个字符
//            char c = s.charAt(i);
//            // 判断当前遍历到的字符是否在集合中出现过
//            if(!tm.containsKey(c))
//                //表示当前字符是第一次出现。
//                tm.put(c,1);
//            else
//                //存在,表示当前字符已经出现过了
//                //先获取这个字符已经出现的次数
//                Integer count = tm.get(c);
//                //自增,表示这个字符又出现了依次
//                count++;
//                //将自增后的结果再次添加到集合中。
//                tm.put(c,count);
//            
//        
        //  a(5)b(4)c(3)d(2)e(1)
        //System.out.println(tm);
        treeMap.forEach(
                (Character key,Integer value)->
                    System.out.print(key + "(" + value + ")");
                
        );
    

运行结果如下:

3. TreeMap和HashMap的关联与区别

二者都实现的是Map,Map是通过对象来对 对象进行索引的,用来索引的对象叫键key,其对应的对象叫值value;

1、HashMap是通过hashcode()对其内容进行快速查找的;HashMap中的元素是没有顺序的;
TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap;

2、HashMap和TreeMap都不是线程安全的;

3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals() 方法,以确保两个相等的映射返回相同的哈希值;

TreeMap继承SortedMap类;他保持键的有序顺序;

4、HashMap:基于hash表实现的;使用HashMap要求添加的键类明确定义了hashcode() 和equals() (可以重写该方法);为了优化HashMap的空间使用,可以调优初始容量和负载因子;

TreeMap:基于红黑树实现的;TreeMap就没有调优选项,因为红黑树总是处于平衡的状态;

5、HashMap:适用于Map插入,删除,定位元素;

TreeMap:适用于按自然顺序或自定义顺序遍历键(key);

以上是关于Java:TreeMap集合探究的主要内容,如果未能解决你的问题,请参考以下文章

java中,如何实现集合的升序和降序排列

Java 集合多条件多规则排序 升序 降序 空值处理

Java 集合多条件多规则排序 升序 降序 空值处理

集合-Java中Arrays.sort()自定义数组的升序和降序排序

java8新特性:对map集合排序,根据key或者value操作排序(升序降序)

TreeMap 的排序冲突吗