Java TreeMap:基于红黑树的排序映射解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Java TreeMap:基于红黑树的排序映射解析

在Java的集合框架中,TreeMap是一个非常重要的成员,它实现了SortedMap接口,为键(Key)提供了一个有序的映射。这种有序性是通过红黑树数据结构来实现的,红黑树是一种自平衡的二叉查找树,它能够在最坏的情况下保证基本的动态集合操作(如查找、插入和删除)的时间复杂度仍然是对数的。


1. TreeMap概述


TreeMap存储的键值对默认是按照键的自然顺序进行排序的,也可以根据创建TreeMap时提供的Comparator进行排序。这意味着当你遍历TreeMap时,你会得到一个按键排序的键值对序列。


2. TreeMap的内部结构


红黑树TreeMap实现有序性的关键。红黑树的特性确保了树的平衡,从而在插入、删除和查找操作时都能保持对数级别的时间复杂度。红黑树的每个节点都有一个颜色属性——红色或黑色,并且满足以下性质:

  • 每个节点或是红色,或是黑色。
  • 根节点是黑色。
  • 每个叶子节点(NIL节点,空节点)是黑色。
  • 如果一个节点是红色的,则它的两个子节点都是黑色的。
  • 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

这些性质确保了树的高度相对较低,从而优化了性能。


3. TreeMap的使用场景


  • 当你需要一个有序的键值对集合时。
  • 当你需要对键进行范围查询时(例如查找所有键在指定范围内的元素)。
  • 当你需要一个能够在插入和删除时保持高效性能的数据结构时。


4. 示例代码


下面是一个简单的示例,展示了如何使用TreeMap

import java.util.TreeMap;
public class TreeMapExample {
    public static void main(String[] args) {
        // 创建一个TreeMap实例,按照键的自然顺序排序
        TreeMap<String, Integer> treeMap = new TreeMap<>();
        
        // 向TreeMap中添加元素
        treeMap.put("apple", 1);
        treeMap.put("orange", 2);
        treeMap.put("banana", 3);
        treeMap.put("pear", 4);
        
        // 遍历并打印TreeMap中的元素(按键的顺序)
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
        
        // 根据键的范围查询元素(包含起始键,不包含结束键)
        TreeMap<String, Integer> subMap = (TreeMap<String, Integer>) treeMap.subMap("apple", "pear");
        System.out.println("Elements between 'apple' and 'pear':");
        for (Map.Entry<String, Integer> entry : subMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

输出:

apple: 1
banana: 3
orange: 2  # 注意这里的顺序,因为按照字母顺序排序了键
pear: 4    # 同上,尽管在插入时pear是在orange后面的,但在排序后它的顺序改变了
Elements between 'apple' and 'pear':  # 范围查询结果不包括'pear'键对应的元素
apple: 1
banana: 3  # 注意这里只有banana是因为orange不在apple和pear之间(按照字母顺序)

注意:在上面的输出中,你可能会注意到“orange”和“banana”的顺序似乎与插入顺序不同。这是因为TreeMap默认按键的自然顺序(这里是字母顺序)对键进行排序,而不是按照插入顺序。此外,范围查询的结果也是有序的,并且不包括结束键对应的元素。如果你想按照特定的顺序对键进行排序,可以在创建TreeMap时提供一个自定义的Comparator


5. 自定义排序


为了按照自定义的顺序对TreeMap中的键进行排序,可以在创建时传入一个Comparator对象:

import java.util.Comparator;
import java.util.TreeMap;
public class CustomSortedTreeMap {
    public static void main(String[] args) {
        // 创建一个自定义排序的TreeMap实例(按照字符串长度排序)
        TreeMap<String, Integer> treeMap = new TreeMap<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(), o2.length());
            }
        });
        
        // 向TreeMap中添加元素并打印(按键的长度顺序)
        treeMap.put("apple", 1);  // 长度为5的键
        treeMap.put("kiwi", 2);   // 长度为4的键
        treeMap.put("pear", 3);   // 长度为4的键
        treeMap.put("banana", 4); // 长度为6的键,会被放在最后面即使它是先被插入的
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

在这个例子中,我们提供了一个自定义的Comparator来按照字符串的长度对键进行排序。因此,“kiwi”和“pear”(长度为4)将出现在“apple”(长度为5)之前,“banana”(长度为6)将出现在最后,即使它是第一个被插入的元素。

相关文章
|
4天前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
14天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
38 5
|
13天前
|
Oracle Java 关系型数据库
课时37:综合实战:数据表与简单Java类映射转换
今天我分享的是数据表与简单 Java 类映射转换,主要分为以下四部分。 1. 映射关系基础 2. 映射步骤方法 3. 项目对象配置 4. 数据获取与调试
|
1月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
93 29
|
27天前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
29 4
|
1月前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
2月前
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
63 15
|
2月前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
88 6
|
2月前
|
存储 算法 搜索推荐
【潜意识Java】期末考试可能考的高质量大题及答案解析
Java 期末考试大题整理:设计一个学生信息管理系统,涵盖面向对象编程、集合类、文件操作、异常处理和多线程等知识点。系统功能包括添加、查询、删除、显示所有学生信息、按成绩排序及文件存储。通过本题,考生可以巩固 Java 基础知识并掌握综合应用技能。代码解析详细,适合复习备考。
32 4
|
2月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
76 7

推荐镜像

更多