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);
        }
    }
}
目录
相关文章
|
传感器 机器学习/深度学习 编解码
最新综述!基于视觉的自动驾驶环境感知(单目、双目和RGB-D)
目相机使用来自单个视点的图像数据作为输入来估计对象深度,相比之下,立体视觉是基于视差和匹配不同视图的特征点,深度学习的应用也进一步提高了准确性。此外,SLAM可以建立道路环境模型,从而帮助车辆感知周围环境并完成任务。本文介绍并比较了各种目标检测和识别方法,然后解释了深度估计的发展,并比较了基于单目、立体和RGB-D传感器的各种方法,接下来回顾并比较了SLAM的各种方法。最后总结了当前存在的问题,并提出了视觉技术的未来发展趋势。
最新综述!基于视觉的自动驾驶环境感知(单目、双目和RGB-D)
|
5月前
|
机器学习/深度学习 运维 监控
纸箱传送带检测数据集(近2900张已标注)|YOLO工业视觉训练数据集
本数据集含近2900张真实工业场景图像,精准标注纸箱、传送带、纸板三类目标,采用YOLO标准格式,开箱即用。适用于YOLOv5/v8等模型训练,支持物流分拣、包装检测、状态识别等工业视觉任务,兼顾教学、科研与工程落地。
|
6月前
|
人工智能 Linux iOS开发
OpenClaw+QMT‑MCP量化交易实战:AI交易员全流程部署、模型配置与自动交易实现(附阿里云/Windows/macOS/Linux部署OpenClaw教程)
在量化交易领域,自动化执行与策略智能化已成为主流方向。OpenClaw(Clawdbot)作为开源AI Agent框架,可充当交易系统的“大脑”,负责理解指令、分析行情、拆解逻辑、规划执行;QMT‑MCP则遵循MCP(Model Context Protocol)协议,将本地QMT交易客户端封装为标准接口,成为AI交易员的“执行双手”,完成下单、撤单、查询持仓、查询资产等真实交易操作。
3513 7
|
缓存 编解码 算法
Netty源码—6.ByteBuf原理一
本文深入探讨了Netty中ByteBuf的使用与内存管理机制。主要内容包括ByteBuf的问题整理、结构及重要API、ByteBuf的分类及其补充说明。此外,还详细分析了内存分配器ByteBufAllocator的功能,包括其两大子类UnpooledByteBufAllocator和PooledByteBufAllocator的实现原理,尤其是PooledByteBufAllocator通过PoolArena进行内存分配的具体流程。最后,总结了ByteBuf的主要内容分为内存抽象、分配策略和回收过程三大方面,为高效使用ByteBuf提供了理论基础。
|
8月前
|
缓存 JavaScript 开发者
微信小游戏开发的技术难点
微信小游戏开发在2026年面临五大技术挑战:高性能模式下的内存管控、WASM性能瓶颈、4MB主包极速启动、跨平台渲染一致性及开放数据域通信限制。开发者需在严苛环境下实现流畅体验,考验极致优化能力。#微信小游戏 #游戏外包
|
存储 人工智能 前端开发
从零构建智能对话助手:LangGraph + ReAct 实现具备记忆功能的 AI 智能体
本文系统介绍了基于 LangGraph 框架构建具备记忆能力的 ReAct(Reasoning + Action)智能体的技术实现方法。ReAct 智能体结合语言模型的推理能力与外部工具的执行能力,通过“思考-行动-观察”循环机制,实现复杂任务的自主处理。文章详细讲解了 LangGraph 的图结构设计、状态管理、工具集成与记忆系统等关键技术,并通过代码示例演示了从基础工作流到高级智能体系统的构建过程。最终实现的智能体具备多轮对话、工具调用、结果反馈与上下文记忆能力,为开发下一代智能应用提供了技术基础。
1819 1
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
2126 5
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
1819 0
|
存储
|
关系型数据库 MySQL 数据库
在 MySQL 中使用 Alter Table
【8月更文挑战第11天】
3100 0
在 MySQL 中使用 Alter Table

热门文章

最新文章