【日常记录】关于LinkedHashMap中key为数字字符串根据compareTo排序的问题

news2024/12/26 3:51:18

今天在修复Bug的时候,在项目中发现有这样一段代码(为了方便,下面用一个例子进行演示)。
项目中使用了LinkedHashMap key为Long类型,value为String类型。
并且,LinkedHashMap 使用Stream流 对key进行升序的排列,看了代码貌似没有什么问题。

  LinkedHashMap<Long, String> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put(12L, "测试1");
        linkedHashMap.put(26L, "测试2");
        linkedHashMap.put(8L, "测试3");
        linkedHashMap.put(120L, "测试4");
        linkedHashMap.put(4L, "测试5");

        LinkedHashMap<Long, String> resLinkHashMap = linkedHashMap.entrySet().stream().sorted((o1, o2) -> {
            String key1 = o1.getKey().toString();
            String key2 = o2.getKey().toString();
            return key1.compareTo(key2);
        }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println("resLinkHashMap = " + resLinkHashMap);

运行后结果是这样的:

resLinkHashMap = {12=测试1, 120=测试4, 26=测试2, 4=测试5, 8=测试3}

发现结果并没有按照key进行从小到大的规则进行排序。
于是下面分析了String中的compareTo方法 排序规则到底是怎样的,特地记录一下:

在Java中,我们通常使用String类的compareTo()函数来比较两个字符串的大小。compareTo()函数返回一个整数值,用于表示两个字符串的大小关系。

String 类 compareTo() 方法按字典顺序将给定字符串与当前字符串进行比较。它是根据字符串中每个字符的 Unicode 值比较字符串的,它返回正数、负数或 0。

比较规则如下:

  • 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值。

  • 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符作比较,也是返回差值。

  • 由此此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度,返回他们长度的差值。

从源码角度分析compareTo()方法:
JDK 1.8 源码分析
知道了上述的排序规则后,我们进行简单测试下:

        int i = "10".compareTo("3");
        System.out.println("i = " + i);

i = -2

根据返回排序规则,上面返回了-2 ,是字符 1、字符3 的ASCII的值: 65 - 67 = -2 的结果,结果却小于0。 导致10 < 3。这就是上面LinkedHashMap 根据key 转化为String 后使用compareTo 排序的问题所在。

注意:对于字符串长度不能的数字字符串不能使用compareTo进行比较。

对上面的排序方法进行修改如下:

        LinkedHashMap<Long, String> resLinkHashMap = linkedHashMap.entrySet()
                .stream().sorted(Comparator.comparingInt(o -> o.getKey().intValue()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        System.out.println("resLinkHashMap = " + resLinkHashMap);

resLinkHashMap = {4=测试5, 8=测试3, 12=测试1, 26=测试2, 120=测试4}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java web(六):FilterListenerAJAX

文章目录 一、Filter1.1 基本介绍1.2 过滤器的执行流程1.3 拦截路径配置1.4 过滤器链1.5 案例 二、Listener三、AJAX3.1 快速入门3.2 Axios异步框架 四、 JSON4.1 JSON基础语法4.2 Fastjson 五、 案例JSONAxiosServlet Java web的三大组件&#xff1a;Servlet、Filter、Listene…

2023最新版本 FreeRTOS教程 -5-切断驱动和应用的直接关联与多输入的编码思路

在多输入的场景方便添加新的设备如图 总体的思路框图 函数讲解&#xff08;图片太抽象通过这个函数理解&#xff09; 写入自己的队列 统一数据(建议读取自己的队列 再统一到应用的队列 这里图方便省略了) 通过统一的数据做出执行操作 验证 队列为空直接阻塞 通过三个按…

AST注入-从原型链污染到RCE

文章目录 概念漏洞Handlebarspug 例题 [湖湘杯 2021 final]vote 概念 什么是AST注入 在NodeJS中&#xff0c;AST经常被在JS中使用&#xff0c;作为template engines(引擎模版)和typescript等。对于引擎模版&#xff0c;结构如下图所示。 如果在JS应用中存在原型污染漏洞&…

Linux网络配置、ping不通外网解决办法

有很多说服务当中有五项才是对的&#xff0c;也不一定&#xff0c;我这里也只有四项&#xff0c;所以在尝试一些其他办法后再决定重新安装vmware吧&#xff0c;最开始我也ping不成功&#xff0c;查看也是四项&#xff0c;重新装了一次还是四项&#xff0c;找了一些办法&#xf…

芯片测试概述

芯片为什么要做测试 在芯片设计到制作的过程中 不可避免会出现缺陷 芯片测试就是为了发现产生缺陷的芯片 如果不加入测试环节 将有缺陷的芯片卖给顾客 受到的损失是测试的花费的数倍 芯片测试的作用 1. 保证芯片的质量 2. 缩短芯片上市时间 3. 提高公司利润 芯片的测试类型 …

SINAMICS S120变频器电流转矩功率限幅功能

转矩限幅是SINAMICS S120变频器中一个常用的功能&#xff0c;可以用来限制电机轴上的输出转矩&#xff0c;以达到所希望的控制目标&#xff0c;也可以用来保证机械设备的安全。为了实现转矩的限幅有3种实现方式&#xff1a;电流限幅、转矩限幅、功率限幅。 电流限幅中的电流值…

【Java】汉诺塔

汉诺塔 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff08;河内塔&#xff09;&#xff1a;把圆盘从下面开始按大小顺序重新摆放到另一根柱子上&#xff0c;并且小圆盘上不能放大圆盘&#xff0c;在三根柱子之间一次只能移动一个圆盘。 汉诺塔规则 disk表示圆盘数一次只…

这5个老年人技巧,让你的微信操作起来更方便

目录 一、便捷登录验证 二、快速开启关怀模式 三、语音与消息撤回 四、快速打开名片二维码 五、语音收藏 六、总结 今天小编给大家分享5个老年人技巧&#xff0c;一起来看看吧&#xff01;说不定也能让你的微信操作起来更方便呢&#xff01; 一、便捷登录验证 在微信中&a…

GAMP源码阅读:PPP中的模型改正:对流层延迟、电离层延迟

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、对流层延迟改正1、原理2、model_trop()&#xff1a;对流层改正入口函数3、tropmodel()&#xff1a;Saastamoinen 模型改正计算延迟1. Saastam…

redis数据库缓存服务器

redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用&#xff1a;加快访问速度&#xff0c;缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作&#xff0c;要么全部执行&#xff0…

模拟与高精度

文章目录 模拟[NOIP2003 普及组] 乒乓球[NOIP2015 普及组] 扫雷游戏[NOIP2016 提高组] 玩具谜题 高精度P1601 AB Problem&#xff08;高精&#xff09;P1303 A*B Problem[NOIP1998 普及组] 阶乘之和 #mermaid-svg-LVtcjL47i4zwUnwI {font-family:"trebuchet ms",verd…

面试梳理-Redis01

目录 开场白-追命3连 使用场景 01缓存穿透场景与方案 02布隆过滤器 03缓存击穿场景与方案 04缓存雪崩场景与方案 开场白-追命3连 看你项目中有说用到Redis&#xff0c;都是哪些场景使用了Redis呢&#xff1f; 如果发生了缓存穿透、击穿、雪崩如何应对呢&#xff1f;缓存…

程序员笔记本电脑选 windows 还是 MAC

计算机选择是每个进入 IT 行业同学的第一个重要选择&#xff0c;那么你是怎么选择的呢&#xff1f; 选择操作系统&#xff08;Windows还是macOS&#xff09;取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点&#xff0c;下面将分别讨论它们&#xff0c;以帮助…

一文搞懂设计模式之七大原则

大家好&#xff0c;我是晴天。在接下来的一个多月里&#xff0c;我将跟大家一起学习设计模式的一些基础知识和基本应用。不要问我为什么突然想起来写一个设计模式系列的文章&#xff0c;问就是&#xff1a;爱过。。。 问题引出 作为程序猿的我们&#xff0c;隔三岔五的就会因为…

上班族必备:制作电子宣传册的网站

​对于上班族来说&#xff0c;制作电子宣传册是一项非常重要的技能。因为宣传册是展示公司形象、产品特点、服务优势的重要工具&#xff0c;也是与客户沟通交流的重要手段。那么&#xff0c;如何制作一份高质量的电子宣传册呢&#xff1f;今天就为大家推荐几个制作电子宣传册的…

hackergame2023菜菜WP

文章目录 总结Hackergame2023更深更暗组委会模拟器猫咪小测标题HTTP集邮册Docker for everyone惜字如金 2.0Git? Git!高频率星球低带宽星球小型大语言模型星球旅行日记3.0JSON ⊂ YAML? 总结 最近看到科大在举办CTF比赛&#xff0c;刚好我学校也有可以参加&#xff0c;就玩了…

SQL左连接实战案例

要求&#xff1a;用表df1和表df2的数据&#xff0c;得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…

【LeetCode刷题-链表】--328.奇偶链表

328.奇偶链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ clas…

【漏洞复现】Apache_Tomcat_PUT方法任意写文件(CVE-2017-12615)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证工具扫描验证POC 1.6、修复建议 说明内容漏洞编号CVE-2017-12615漏洞名称Tomcat_PU…

python实现多帧torch.istft的结果可以由多个单帧torch.istft的结果重叠拼接得到

&#x1f525; &#x1f525; &#x1f525; 背景&#xff1a;做某个项目&#xff08;由于项目处于保密状态&#xff0c;只提供思路&#xff09;&#xff0c;需要求多帧的istft。但是手头只有单帧的istft代码(当然不能python代码&#xff0c;不然就直接调包)。 &#x1f4e3; …