TreeMap的排序

简介: TreeMap的排序

概述

Map是键值对的集合接口,它的实现类主要包括:HashMap、Hashtable以及LinkedHashMap等。

  1. TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
  2. HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。

Map.Entry返回Collections视图。

按key排序

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序。

TreeMap默认按key升序排序

public class T0 {
   
    public static void main(String[] args) {
   
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "a");
        treeMap.put(3, "b");
        treeMap.put(2, "c");

        for (Map.Entry<Integer, String> item :
                treeMap.entrySet()) {
   
            System.out.println(item);
        }
        Map.Entry<Integer, String> entry = treeMap.firstEntry();
        System.out.println("entry = " + entry);
    }
}

修改TreeMap的排序方式,按key降序排序

实现方式是自定义Comparator,可以直接使用Comparator.reverseOrder()或者手动实现Comparator.

new TreeMap<>(Comparator.reverseOrder())

public class T1 {
   
    public static void main(String[] args) {
   
        Comparator<Integer> keyComparator = new Comparator<Integer>() {
   
            @Override
            public int compare(Integer o1, Integer o2) {
   
                return o2.compareTo(o1);
            }
        };

        TreeMap<Integer, String> treeMap = new TreeMap(keyComparator);
        treeMap.put(1, "a");
        treeMap.put(3, "b");
        treeMap.put(2, "c");

        for (Map.Entry<Integer, String> item :
                treeMap.entrySet()) {
   
            System.out.println(item);
        }
        Map.Entry<Integer, String> entry = treeMap.firstEntry();
        System.out.println("entry = " + entry);
    }
}

按Value排序

以下只演示按TreeMap按Value升序排序,这同样适用于HashMap。

修改TreeMap的排序方式,按Value升序排序

注意:正常情况下Map是不可以使用Collections.sort()方法进行排序的,不过可以将Map转换成list之后再进行排序。

public class T2 {
   
    public static void main(String[] args) {
   

        Comparator<Map.Entry<Integer, String>> comparator = new Comparator<Map.Entry<Integer, String>>() {
   
            @Override
            public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
   
                return o1.getValue().compareTo(o2.getValue());
            }
        };

        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(1, "a");
        treeMap.put(9, "e");
        treeMap.put(3, "b");
        treeMap.put(2, "c");
        ArrayList<Map.Entry<Integer, String>> list = new ArrayList<Map.Entry<Integer, String>>(treeMap.entrySet());
        Collections.sort(list, comparator);

        for (Map.Entry<Integer, String> entry : list) {
   
            System.out.println(entry);
        }
    }
}
目录
相关文章
|
算法 数据挖掘 Python
使用python实现FP-Growth算法
使用python实现FP-Growth算法
613 0
|
17天前
|
机器学习/深度学习 运维 监控
纸箱传送带检测数据集(近2900张已标注)|YOLO工业视觉训练数据集
本数据集含近2900张真实工业场景图像,精准标注纸箱、传送带、纸板三类目标,采用YOLO标准格式,开箱即用。适用于YOLOv5/v8等模型训练,支持物流分拣、包装检测、状态识别等工业视觉任务,兼顾教学、科研与工程落地。
|
3月前
|
缓存 JavaScript 开发者
微信小游戏开发的技术难点
微信小游戏开发在2026年面临五大技术挑战:高性能模式下的内存管控、WASM性能瓶颈、4MB主包极速启动、跨平台渲染一致性及开放数据域通信限制。开发者需在严苛环境下实现流畅体验,考验极致优化能力。#微信小游戏 #游戏外包
|
9月前
|
存储 人工智能 前端开发
从零构建智能对话助手:LangGraph + ReAct 实现具备记忆功能的 AI 智能体
本文系统介绍了基于 LangGraph 框架构建具备记忆能力的 ReAct(Reasoning + Action)智能体的技术实现方法。ReAct 智能体结合语言模型的推理能力与外部工具的执行能力,通过“思考-行动-观察”循环机制,实现复杂任务的自主处理。文章详细讲解了 LangGraph 的图结构设计、状态管理、工具集成与记忆系统等关键技术,并通过代码示例演示了从基础工作流到高级智能体系统的构建过程。最终实现的智能体具备多轮对话、工具调用、结果反馈与上下文记忆能力,为开发下一代智能应用提供了技术基础。
1474 1
|
存储
|
算法 大数据 网络安全
|
安全 关系型数据库 MySQL
MySQL非root安装-初始化数据库时unknown variable ‘defaults-file=**/my.cnf‘
解决安装过程中出现的问题通常需要仔细地检查错误日志、配置文件和执行命令,保证各项配置设置的精确无误是顺利完成安装的关键。通过上述的步骤分析和解决方案,非root用户安装MySQL时遇到"unknown variable 'defaults-file=**/my.cnf'"的问题应该可以得到妥善的解决。
1363 0
|
安全 Java 测试技术
阿里开发手册 嵩山版-编程规约 (五)日期时间的规范
《阿里开发手册 嵩山版》的日期时间规范部分提供了关于日期时间处理的强制性和推荐性规约,包括日期格式化、时间获取、避免硬编码日期、处理闰年问题等,以确保程序在时间处理上的准确性和稳定性。
|
Kubernetes 负载均衡 网络协议
在K8S中,headless服务是什么?
在K8S中,headless服务是什么?
|
机器学习/深度学习 自然语言处理 数据挖掘
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
预训练语言模型中Transfomer模型、自监督学习、BERT模型概述(图文解释)
733 0