TreeMap

本文介绍了JavaTreeMap的数据结构特点,重点讲解了如何利用Comparable接口和Comparator进行自定义排序,以及在实际场景中的应用,如按照整数ID升序/降序排列和学生对象的复合排序。还演示了如何用TreeMap统计字符串字符出现次数。
摘要由CSDN通过智能技术生成

TreeMap:

TreeMap跟TreeSet底层原理一样,都是红黑树结构的,增删改查性能较好

由键决定特性:不重复,无索引,可排序

可排序:对键进行排序

注意:默认按照简单从小到大进行排序,也可以自己规定键的排序顺序

代码书写两种规则:

①实现Comparable接口,制定比较规则

②创建集合时传递Comparator比较器对象,指定比较规则

如果两种规则同时存在,以第二个为主

练习:TreeMap基本应用

需求1:

键:整数表示id;值:字符串表示商品名称

要求:按照id的升序排列、按照id的降序排列

(1)按照id升序排列(默认是升序)

package mymapdemo;

import java.util.TreeMap;

public class TreeMapDemo1 {
    public static void main(String[] args) {
        //1.创建集合对象
        //Integer Double默认情况下都是按照升序排列的
        //String 按照字母在ASCII码表中对应的数字升序进行排列
        TreeMap<Integer,String> tm=new TreeMap<>();
        //2.添加元素
        tm.put(1,"可乐");
        tm.put(3,"果冻");
        tm.put(5,"辣条");
        tm.put(4,"饼干");
        tm.put(2,"雪糕");
        //3.打印集合
        System.out.println(tm);
    }
}

运行结果:

 

(2)按照id降序排列

package mymapdemo;

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMapDemo1 {
    public static void main(String[] args) {
        //1.创建集合对象
        //Integer Double默认情况下都是按照升序排列的
        //String 按照字母在ASCII码表中对应的数字升序进行排列
        TreeMap<Integer,String> tm=new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //o1表示当前要添加的元素,o2表示已经在红黑树中存在的元素
                return o2-o1;
            }
        });
        //2.添加元素
        tm.put(1,"可乐");
        tm.put(3,"果冻");
        tm.put(5,"辣条");
        tm.put(4,"饼干");
        tm.put(2,"雪糕");
        //3.打印集合
        System.out.println(tm);
    }
}

运行结果:

 

需求2:

键:学生对象;值:籍贯

要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名,年龄视为同一个人

package mymapdemo;

import java.util.TreeMap;

public class TreeMapDemo2 {
    public static void main(String[] args) {
        //1.创建集合
        TreeMap<Student,String> tm=new TreeMap<>();
        //2.创建三个学生对象
        Student s1=new Student("zhangsan",25);
        Student s2=new Student("lisi",23);
        Student s3=new Student("wangwu",24);
        //3.添加元素
        tm.put(s1,"黑龙江");
        tm.put(s2,"吉林");
        tm.put(s3,"辽宁");
        //4.打印集合
        System.out.println(tm);

    }
}

运行结果:

练习:统计个数

需求:字符串“aababcabcdabcde”

请统计字符串中每一个字符出现的次数,并按照一下格式输出

a(5)b(4)c (3)d(2)e(1)

package mymapdemo;

import java.util.HashMap;
import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;

public class TreeMapDemo3 {
    public static void main(String[] args) {
        //新的统计思想:利用map集合进行统计
        //HashMap:如果题目中没有要求对结果进行排序,默认使用HashMap
        //Treemap:如果题目中要求对结果进行排序,使用TreeMap

        //键表示要统计的内容;值表示次数
        //1.定义字符串
        String s="aababcabcdabcde";
        //3.创建集合
        TreeMap<Character,Integer> tm=new TreeMap<>();
        //2.遍历字符串得到里面的每一个字符
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //拿着c到集合中判断是否存在
            //存在,表示当前字符又出现了一次
            //不存在,表示当前字符第一次出现
            if(tm.containsKey(c)){
                //存在
                //先把已经出现的数拿出来
                int count = tm.get(c);
                count++;
                //把自增之后的结果添加到集合当中
                tm.put(c,count);
            }else{
                tm.put(c,1);
            }
        }
        //4.遍历集合,并按照指定格式进行拼接
        //4.1 StringBuilder方式拼接
//        StringBuilder sb=new StringBuilder();
//        tm.forEach(( key, value)-> sb.append(key).append("(").append(value).append(")"));
//        System.out.println(sb);
        //4.2 StringJoiner方式拼接
        StringJoiner sj=new StringJoiner("","","");
        tm.forEach(( key, value)-> sj.add(key+"").add("(").add(value+"").add(")"));
        System.out.println(sj);
    }
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值