TreeMap自定义排序
我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。
1. 使用TreeMap默认的排序规则(按字典升序排序)
先来看一下默认的排序规则。
/*** 使用TreeMap默认的排序规则(按字典升序排序)*/
private static void sortByDefault() {TreeMap<String, Integer> treeMap = new TreeMap<>();for (int index = 0; index < 5; index++) {treeMap.put("str_" + index, index);}System.out.println("*****TreeMap默认排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();
}
2. 使用自定义排序规则
使用自定义排序规则对TreeMap进行实例化。
/*** 使用自定义排序规则*/
private static void sortByCustom() {Comparator<String> comparator = (String s1, String s2) -> SortEnum.getSortWeightByValue(s1) - SortEnum.getSortWeightByValue(s2);TreeMap<String, Integer> treeMap = new TreeMap<>(comparator);for (int index = 0; index < 5; index++) {treeMap.put("str_" + index, index);}System.out.println("*****TreeMap自定义排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();
}
3. GroupingBy时使用自定义排序规则
一开始直接用TreeMap::new作为groupingBy方法的第二个参数,但是这种办法只能引用TreeMap的无参构造方法。查看groupingBy的入参可以发现,第二个参数是Supplier类型,于是手动实现Supplier,在方法体中传入自定义比较器,然后返回TreeMap对象。
/*** GroupingBy时使用自定义排序规则*/
private static void sortWhenGroupingBy() {List<String> list = new ArrayList<>();for (int index = 0; index < 5; index++) {list.add("str_" + index);}Comparator<String> comparator = (s1, s2) -> SortEnum.getSortWeightByValue(s1) - SortEnum.getSortWeightByValue(s2);// 如果现在外面定义好Supplier,需要声明TreeMap的key和value的类型,否则可能出现类型不兼容的异常// Supplier<TreeMap<String, List<String>>> supplier = () -> new TreeMap<>(comparator);// TreeMap<String, List<String>> treeMap = list.stream().collect(Collectors.groupingBy(Function.identity(), supplier, Collectors.toList()));TreeMap<String, List<String>> treeMap = list.stream().collect(Collectors.groupingBy(Function.identity(), () -> new TreeMap<>(comparator), Collectors.toList()));System.out.println("*****GroupingBy时自定义排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();
}
完整代码
自定义排序权重类
public enum SortEnum {ZERO(0, "str_1"),FIRST(1, "str_0"),SECOND(2, "str_3"),THREE(3, "str_2"),;private int sortWeight;private String value;SortEnum(int sortWeight, String value) {this.sortWeight = sortWeight;this.value = value;}public static int getSortWeightByValue(String value) {for (SortEnum sortEnum : SortEnum.values()) {if (sortEnum.value.equals(value)) {return sortEnum.sortWeight;}}return Integer.MAX_VALUE;}
}
测试代码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.stream.Collectors;public class TestTreeMap {public static void main(String[] args) {sortByDefault();sortByCustom();sortWhenGroupingBy();}/*** 使用TreeMap默认的排序规则(按字典升序排序)*/private static void sortByDefault() {TreeMap<String, Integer> treeMap = new TreeMap<>();for (int index = 0; index < 5; index++) {treeMap.put("str_" + index, index);}System.out.println("*****TreeMap默认排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();}/*** 使用自定义排序规则*/private static void sortByCustom() {Comparator<String> comparator = (String s1, String s2) -> SortEnum.getSortWeightByValue(s1) - SortEnum.getSortWeightByValue(s2);TreeMap<String, Integer> treeMap = new TreeMap<>(comparator);for (int index = 0; index < 5; index++) {treeMap.put("str_" + index, index);}System.out.println("*****TreeMap自定义排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();}/*** GroupingBy时使用自定义排序规则*/private static void sortWhenGroupingBy() {List<String> list = new ArrayList<>();for (int index = 0; index < 5; index++) {list.add("str_" + index);}Comparator<String> comparator = (s1, s2) -> SortEnum.getSortWeightByValue(s1) - SortEnum.getSortWeightByValue(s2);// 如果现在外面定义好Supplier,需要声明TreeMap的key和value的类型,否则可能出现类型不兼容的异常// Supplier<TreeMap<String, List<String>>> supplier = () -> new TreeMap<>(comparator);// TreeMap<String, List<String>> treeMap = list.stream().collect(Collectors.groupingBy(Function.identity(), supplier, Collectors.toList()));TreeMap<String, List<String>> treeMap = list.stream().collect(Collectors.groupingBy(Function.identity(), () -> new TreeMap<>(comparator), Collectors.toList()));System.out.println("*****GroupingBy时自定义排序规则*****");treeMap.forEach((k, v) -> System.out.println(k + " : " + v));System.out.println();}
}
运行结果:
*****TreeMap默认排序规则*****
str_0 : 0
str_1 : 1
str_2 : 2
str_3 : 3
str_4 : 4*****TreeMap自定义排序规则*****
str_1 : 1
str_0 : 0
str_3 : 3
str_2 : 2
str_4 : 4*****GroupingBy时自定义排序规则*****
str_1 : [str_1]
str_0 : [str_0]
str_3 : [str_3]
str_2 : [str_2]
str_4 : [str_4]
相关文章:
TreeMap自定义排序
我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。 1. 使用TreeMap默认的排序规则(按…...
我的CSDN 512天创作纪念日-20240807
机缘 在 2023 年 3 月 13 日,我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天,我决定将自己的实战项目经验和学习心得记录下来,与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想,促使我…...
微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域
1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库&…...
数据库中的约束,聚合函数以及联合查询
目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...
【AI大模型】Ollama+OpenWebUI+llama3本地大模型
本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 (1)目的 本教程主要关于开源A…...
习题20240807
文章目录 题目 1: 泛型类题目 2: 泛型方法题目 3: 泛型接口题目 4: 泛型约束题目 5: 泛型集合题目6:题目7:题目8:题目9: 题目 1: 泛型类 编写一个泛型类 Box,它能够存储一个类型为 T 的值,并提供方法 SetI…...
src挖掘-记一次有趣的逻辑漏洞分享
漏洞挖掘-记一次有趣的逻辑漏洞挖掘 前言简述1、信息收集2、找功能点3、挖掘漏洞案例一:任意用户注册漏洞案例二-垂直越权导致管理员密码重置获得管理员后台权限漏洞总结 前言 此文章是小白的学习笔记,请不要利用文章内相关知识点进行非法渗透ÿ…...
【C++】STL | list (链表)详解及重要函数的实现
目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init(适合不同类型构造函数的小函数) list的迭代器 引子 operator、operator--(前置与后置) operator 与 operator! operator* 与 …...
警惕智能手机的“隐形眼”:如何保护我们的数字隐私堡垒
随着智能手机深入我们生活的方方面面,它变得无所不在,甚至无所不知。 但你是否意识到,你的手机可能正在悄无声息地“监听”你的一举一动? 从你的搜索习惯到日常对话,手机的个性化推荐系统正不断收集你的数据。 本文…...
人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括了EMLo和transformer架构。此外,课程还详细…...
PicGo + gitee 免费搭建个人图床
目录 1 图床概念2 使用gitee和PicGo搭建图床流程2.1 下载安装PicGo工具 3 图片上传错误处理3.1 PicGo客户端提示404错误信息图片上传失败3.2 PicGo客户端提示400错误信息图片上传失败 1 图床概念 "图床"是一个网络术语,它指的是一种用于存储和托管图片…...
组合数的低复杂度运算
题源 题目 F. 预期中位数 每次测试的时间限制:3 秒 每次测试的内存限制:256 兆字节 Arul 有一个长度为 n 的二进制数组* a。 他将取该数组中所有长度为 k(k 为奇数)的子序列并找到它们的中位数。 所有这些值的总和是多少…...
小型并网式光伏气象站:光伏电站的智能守护者
小型并网式光伏气象站以其独特的功能和优势,成为了电站高效运行的智能守护者。小型并网式光伏气象站通过精准的数据采集与分析,为光伏电站的运维管理提供了强有力的支持。 小型并网式光伏气象站能够实时监测并记录光伏电站周围环境的多种气象参数&#x…...
JavaScript 中的回调函数(callback)
JavaScript 中的回调函数(callback) JavaScript 中的回调函数(callback)是一个传递给另一个函数作为参数的函数,并且这个传递的函数可以在其他函数内部被调用执行。回调函数是异步编程的一个核心概念,特别…...
计算机毕业设计hadoop+spark+hive漫画推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据
HadoopSparkHive漫画推荐系统详细开题报告 一、引言 随着互联网技术的飞速发展,动漫和漫画产业的数据量急剧增长。用户面临着海量漫画作品的选择难题,如何从这些数据中高效地提取有价值的信息,为用户推荐符合其喜好的漫画作品,成…...
解决pycharm日志总是弹出“无法运行Git,未安装Git”的问题
需求分析 我电脑中安装了git,但是打开pycharm,右下角总是弹出 无法运行Git,未安装Git的日志。 解决方法 首先打开pycharm,按照以下路径,依次点击。 file -----settings-----version control -----Git----Git path(选择自己下载…...
threejs 节点材质系统 绑定attribute
新的 节点材质系统 绑定属性及使用 非常方便 不必重复声明 以instances为例 import {instancedBufferAttribute,instancedDynamicBufferAttribute,} from "three/tsl";声明一个 InstancedBufferAttribute 使用 instancedBufferAttribute包装后就可以在shader中直接使…...
Rabbitmq的几种工作模式
工具类 public class RabbitMQConnection {public static Connection getConnection() throws Exception{//1.创建connectionFactoryConnectionFactory connectionFactory new ConnectionFactory();//2.配置HostconnectionFactory.setHost("127.0.0.1");//3.设置Po…...
如何在 Debian 上安装运行极狐GitLab Runner?【二】
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...
简单的docker学习 第13章 CI/CD与Jenkins(下)
第13章 CI/CD 与 Jenkins 13.13 自由风格的 CI 操作(最终架构) 前面的架构存在的问题是,若有多个目标服务器都需要使用该镜像,那么每个目标服务器都需要在本地构建镜像,形成系统资源浪费。若能够在 Jenkins 中将镜像相撞构建好并推送到 Har…...
Z-Image-Turbo-辉夜巫女应用:快速生成动漫角色,打造个人风格画师
Z-Image-Turbo-辉夜巫女应用:快速生成动漫角色,打造个人风格画师 1. 项目介绍与核心功能 1.1 什么是Z-Image-Turbo-辉夜巫女? Z-Image-Turbo-辉夜巫女是一款基于阿里巴巴通义实验室Z-Image-Turbo模型的图像生成工具,专门针对动…...
保姆级教程:从官网下载到成功运行,手把手搞定CANoe 16.0安装(附常见报错排查)
CANoe 16.0安装全攻略:从零开始到完美运行的避坑指南 第一次接触CANoe 16.0时,很多人会被复杂的安装流程和各种报错搞得焦头烂额。作为汽车电子领域最常用的网络测试工具之一,CANoe的安装过程确实比普通软件要复杂得多——从官网下载的正确姿…...
nbdev终极指南:如何用Jupyter Notebook创建专业级软件项目
nbdev终极指南:如何用Jupyter Notebook创建专业级软件项目 【免费下载链接】nbdev Create delightful software with Jupyter Notebooks 项目地址: https://gitcode.com/gh_mirrors/nb/nbdev nbdev是一个革命性的笔记本驱动开发平台,让开发者能够…...
利用快马平台快速原型:五分钟构建你的第一个multisim风格电路仿真器
最近在尝试电路设计时,发现从构思到实际验证往往需要花费大量时间搭建仿真环境。传统方式需要安装专业软件、配置参数,整个过程相当繁琐。直到尝试了InsCode(快马)平台,发现它特别适合用来做电路设计的快速原型验证。下面分享如何用五分钟构建…...
SQLMesh社区贡献指南:如何参与开源项目开发
SQLMesh社区贡献指南:如何参与开源项目开发 【免费下载链接】sqlmesh Scalable and efficient data transformation framework - backwards compatible with dbt. 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmesh SQLMesh是一个可扩展且高效的数据转换…...
Pixel Language Portal部署案例:在信创环境(麒麟OS+海光CPU)中运行Hunyuan-MT-7B
Pixel Language Portal部署案例:在信创环境(麒麟OS海光CPU)中运行Hunyuan-MT-7B 1. 项目背景与价值 **像素语言跨维传送门(Pixel Language Portal)**是基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具,其独特的16-bit像素冒险界…...
从Shenyu网关的线程瓶颈说起:我是如何用gRPC长连接优化配置同步的(Raft实战)
从Shenyu网关的线程瓶颈到gRPC长连接优化:Raft协议实战解析 1. 问题背景与现状分析 在微服务架构中,API网关作为流量入口,其性能直接影响整个系统的稳定性。Apache Shenyu作为流行的开源网关解决方案,默认采用HTTP长轮询机制实现配…...
拓朋N86公网车载台:邮政分拣车高效协同的通信保障
在繁忙的邮政包裹分拣中心,效率与协同是每辆分拣车与调度人员最为关心的两大要素。在这样一片高速运转而充满挑战的天地里,拓朋N86公网集群车载台以其出色的性能,悄然成为了分拣车队的隐形指挥中枢。 全国覆盖,沟通无阻 分拣中心往…...
什么是KCP?QUIC?Websocket?
KCPKCP是一个基于UDP的可靠传输协议,其核心目标是在牺牲一定带宽利用率的前提下,尽可能降低传输延迟。它并非一个全新的传输层协议,而更像是在应用层对UDP数据包进行可靠性、顺序和流量控制的“增强外壳”。其底层具体来说就是在UDP的基础之上…...
Omni-Vision Sanctuary在VMware虚拟机中的隔离部署方案
Omni-Vision Sanctuary在VMware虚拟机中的隔离部署方案 1. 为什么需要虚拟机隔离部署 在AI模型的实际应用中,环境隔离是个经常被忽视但非常重要的问题。想象一下,你正在开发一个基于Omni-Vision Sanctuary的视觉分析系统,突然因为某个依赖库…...
