当前位置: 首页 > news >正文

JAVA 集合进阶 Map集合的实现类 TreeMap

1 TreeMap

  • TreeMap 跟 TreeSe t底层原理一样,都是红黑树结构的。
  • 由键决定特性:不重复、无索引、可排序
  • 可排序:对键进行排序
  • 注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则

1.1 代码书写两种排序规则

  • 实现 comparable 接口,指定比较规则。
  • 创建集合时传递 comparator 比较器对象指定比较规则。

2 TreeMap 练习

2.1 练习一

键:整数表示id
值:字符串表示商品名称
要求:按照id的升序排列、按照id的降序排列

升序

package com.bjpowernode.test20;import java.util.TreeMap;public class TreeMapDemo1 {public static void main(String[] args) {//创建集合对象TreeMap<Integer, String> treeMap = new TreeMap<>();//向集合中添加元素treeMap.put(5, "水杯");treeMap.put(4, "耳机");treeMap.put(3, "手机");treeMap.put(2, "电脑");treeMap.put(1, "文具");//打印集合//默认会按照键的升序进行排列//IntegerDouble默认情况下都是按照升序排列的//String按照字母再AscII码表中对应的数字升序进行排列System.out.println(treeMap);  //{1=文具, 2=电脑, 3=手机, 4=耳机, 5=水杯}}
}

运行结果:

降序

package com.bjpowernode.test20;import java.util.Comparator;
import java.util.TreeMap;public class TreeMapDemo2 {public static void main(String[] args) {//按照 ID 降序排列//创建集合对象TreeMap<Integer, String> treeMap = new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {//o1:当前要添加的元素//o2:表示已经在红黑树中存在的元素return o2 - o1;              //会按照降序输出!!}});//向集合中添加元素treeMap.put(5, "水杯");treeMap.put(4, "耳机");treeMap.put(3, "手机");treeMap.put(2, "电脑");treeMap.put(1, "文具");//打印集合System.out.println(treeMap);    //{5=水杯, 4=耳机, 3=手机, 2=电脑, 1=文具}}
}

运行结果:

2.2 练习二

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

学生类

重点是对 TreeMap 的键进行自定义的排序

package com.bjpowernode.test20;public 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {// 在这里我们要指定规则//按照学生年龄的升序排列,年龄样按照姓名的字母排列,同姓名年龄视为同一个人。//this:表示当前要添加的元素//o:表示已经在红黑树中存在的元素//返回值://负数:表示当前要添加的元素是小的,存左边//正数:表示当前要添加的元素是大的,存右边//0:表示当前要添加的元素已经存在,舍弃int i = this.getAge() - o.getAge();    //用添加的学生对象的年龄 和 红黑树中已经存在的学生对象的年龄去比较i = i == 0 ? this.getName().compareTo(o.getName()) : i;   // 先判断 i 的值是否为 0 ,如果是 0 (代表年龄一样),那么再按照姓名比较// 如果不是 0,那么把 i 的值再交给 ireturn i;   //直接返回 i}
}

测试类

package com.bjpowernode.test20;import java.util.TreeMap;public class TreeMapDemo3 {public static void main(String[] args) {// 1 创建集合TreeMap<Student, String> treeMap = new TreeMap<>();// 2 创建三个学生对象Student s1 = new Student("张三", 23);Student s2 = new Student("李四", 25);Student s3 = new Student("王五", 21);//添加元素treeMap.put(s1, "南京");treeMap.put(s2, "杭州");treeMap.put(s3, "洛阳");//打印集合System.out.println(treeMap);   // 因为 TreeMap 会默认对键排序,而我们传入的是自定义对象// 如果不再自己定义键的排序方法,则会报错}
}

运行结果:

2.3 练习三

字符串“aababcabcdabcde"
请统计字符串中每一个字符出现的次数,并按照以下格式输出
输出结果:a(5)b(4)c(3)d(2)e(1)

package com.bjpowernode.test20;import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;public class TreeMapDemo4 {public static void main(String[] args) {//新的统计思想:利用 Map 集合进行统计//如果题目中没有要求对结果进行排序,默认使用  HashMap//如果题目中要求对结果进行排序,请使用  TreeMap//定义字符串String s = "aababcabcdabcde";//创建集合TreeMap<Character, Integer> treeMap = new TreeMap<>();//遍历字符串for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);//拿着 c 到集合中判断是否存在if(treeMap.containsKey(c)){   //存在int count = treeMap.get(c);count++;treeMap.put(c, count);} else {treeMap.put(c, 1);}}//4 遍历集合Set<Map.Entry<Character, Integer>> entries = treeMap.entrySet();for (Map.Entry<Character, Integer> entry : entries) {System.out.print(entry.getKey() + "(" + entry.getValue() + ")");}System.out.println();// 4 以上字符串拼接,可以使用 StringBuilderStringBuilder sb = new StringBuilder();treeMap.forEach(new BiConsumer<Character, Integer>() {      // 这个匿名内部类还可以省略@Overridepublic void accept(Character key, Integer value) {sb.append(key).append("(").append(value).append(")");}});System.out.println(sb);// 4 以上字符串拼接,可以使用 StringJoinerStringJoiner sj = new StringJoiner("", "", "");treeMap.forEach(new BiConsumer<Character, Integer>() {      // 这个匿名内部类还可以省略@Overridepublic void accept(Character key, Integer value) {sj.add(key + "").add("(").add(value + "").add(")");}});System.out.println(sj);}
}

运行结果:

3 总结

3.1 TreeMap集合的特点是怎么样的?

  • 不重复、无索引、可排序
  • 底层基于红黑树实现排序,增删改查性能较好

3.2 TreeMap集合排序的两种方式

  • 实现 comparable 接口,指定比较规则
  • 创建集合时传递 Comparator 比较器对象指定比较规则

参考链接:

集合进阶-10-TreeMap的基本使用和基础练习1_哔哩哔哩_bilibili

集合进阶-11-TreeMap练习2-键位置添加自定义对象_哔哩哔哩_bilibili

http://www.dtcms.com/a/232021.html

相关文章:

  • 电子电路:空气也会形成电容吗?
  • 并发工具【上】——线程池及其操作
  • Elasticsearch的插件(Plugin)系统介绍
  • 多态(全)
  • 企业级实战之Iptables防火墙案例分析
  • 11. MySQL事务管理(上)
  • 极客大挑战 2019 EasySQL 1(万能账号密码,SQL注入,HackBar)
  • 3.spring基础入门(三)
  • 打卡day44
  • typescript中的type如何使用
  • 信息学奥赛一本通 1570:【例 2】能量项链 | 1843:【06NOIP提高组】能量项链 | 洛谷 P1063 [NOIP 2006 提高组] 能量项链
  • MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?
  • React-native实战系列
  • 论文速读《VideoMimic:通过视觉模仿实现人形机器人感知控制》
  • 玩转Docker | 使用Docker部署Qwerty Learner英语单词学习网站
  • 第八部分:第三节 - 事件处理:响应顾客的操作
  • AXPM11584:颠覆传统,发现新可能
  • 省赛中药检测模型调优
  • 电路图识图基础知识-降压启动(十五)
  • Java面试题及答案整理( 2025年最新版,持续更新...)
  • 理解继承与组合的本质:Qt 项目中的设计选择指南
  • 《射频识别(RFID)原理与应用》期末复习 RFID第一章 射频识别技术概论(知识点总结+习题巩固)
  • 前端css外边距塌陷(Margin Collapse)现象原因和解决方法
  • 核心机制:拥塞控制
  • 使用 LangChain 和 RAG 实现《斗破苍穹》文本问答系
  • Ros(控制机器人运动)
  • c++提升
  • 系统巡检常见工作
  • Python多线程编程:从GIL锁到实战优化
  • UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误