Java TreeMap 字符串键的自定义数值降序排序指南

Java TreeMap 字符串键的自定义数值降序排序指南

本文深入探讨了java `treemap`在处理字符串类型键时,如何实现非默认的自定义排序逻辑。针对`treemap`默认的字典序排序无法满足数值或长度降序排列的需求,文章详细介绍了通过提供定制化的`comparator`来转换字符串为数值进行比较,并实现降序排列的方法,确保键的排序符合预期。

理解 TreeMap 的默认排序行为

TreeMap是Java集合框架中一个基于红黑树实现的Map接口,它能保证其键(key)是按自然顺序(natural ordering)排序的,或者根据在创建TreeMap时提供的Comparator进行排序。对于String类型的键,其自然顺序是字典序(lexicographical order)。这意味着TreeMap会按照字符的Unicode值逐个比较字符串,例如 “10” 会排在 “2” 之前,因为字符 ‘1’ 的Unicode值小于 ‘2’。

考虑以下示例代码:

import java.util.Map;import java.util.TreeMap;public class ApplicationMain {    public static void main(String[] args) {        final Map sampleTreeMap = new TreeMap();        sampleTreeMap.put("5903766131", 6);        sampleTreeMap.put("5903767", 7);        sampleTreeMap.put("590376614", 5);        sampleTreeMap.put("5903766170", 9);        sampleTreeMap.put("59037662", 12);        sampleTreeMap.put("5903766410", 10);        System.out.println("默认 TreeMap 排序结果:");        sampleTreeMap.entrySet().stream().forEach(entry ->{            System.out.println("Key : " + entry.getKey() + " -- Value : " + entry.getValue());        });    }}

其输出结果将是:

默认 TreeMap 排序结果:Key : 5903766131 -- Value : 6Key : 590376614 -- Value : 5Key : 5903766170 -- Value : 9Key : 59037662 -- Value : 12Key : 5903766410 -- Value : 10Key : 5903767 -- Value : 7

可以看到,”5903766131″ 排在 “59037662” 之前,因为在第三个字符 ‘0’ 和 ‘6’ 的比较中,’0′ 小于 ‘6’。这与我们期望的将字符串作为数值进行降序排序(即数值越大、位数越多的排在前面)的需求不符。

立即学习“Java免费学习笔记(深入)”;

实现自定义数值降序排序

当String类型的键实际上代表数值,并且需要按照这些数值的大小进行排序时,我们不能依赖String的默认字典序。解决方案是为TreeMap提供一个自定义的Comparator。这个Comparator的任务是将String键转换为数值类型(例如Long),然后根据这些数值进行比较。

使用 Comparator.comparingLong 实现

Java 8 引入的Comparator接口提供了强大的静态方法来简化比较器的创建。comparingLong方法可以接受一个函数,该函数将比较对象转换为long类型,然后基于long值进行比较。结合reversed()方法,可以轻松实现降序排列。

Seede AI Seede AI

AI 驱动的设计工具

Seede AI 586 查看详情 Seede AI

import java.util.Comparator;import java.util.Map;import java.util.TreeMap;public class ApplicationMain {    public static void main(String[] args) {        // 创建一个自定义 Comparator,将 String 键转换为 Long 进行比较,并按降序排列        final Map sampleTreeMap =             new TreeMap(Comparator.comparingLong((String s) -> Long.parseLong(s)).reversed());        sampleTreeMap.put("5903766131", 6);        sampleTreeMap.put("5903767", 7);        sampleTreeMap.put("590376614", 5);        sampleTreeMap.put("5903766170", 9);        sampleTreeMap.put("59037662", 12);        sampleTreeMap.put("5903766410", 10);        System.out.println("自定义数值降序排序结果:");        sampleTreeMap.entrySet().stream().forEach(entry ->{            System.out.println("Key : " + entry.getKey() + " -- Value : " + entry.getValue());        });    }}

运行上述代码,输出将符合我们的预期:

自定义数值降序排序结果:Key : 5903766410 -- Value : 10Key : 5903766170 -- Value : 9Key : 5903766131 -- Value : 6Key : 590376614 -- Value : 5Key : 59037662 -- Value : 12Key : 5903767 -- Value : 7

代码解析:

new TreeMap(…): 在创建TreeMap时传入一个Comparator实例。Comparator.comparingLong(…): 这是一个静态方法,它接受一个Function作为参数。这个Function的职责是将String类型的键转换为long类型。(String s) -> Long.parseLong(s): 这是一个Lambda表达式,实现了Function接口。它接收一个String s,并使用Long.parseLong(s)将其解析为long值。.reversed(): 在comparingLong生成的比较器基础上调用此方法,将排序顺序反转,实现降序排列。

注意事项与扩展

非数字字符串处理:上述解决方案假设所有String键都能被成功解析为Long类型。如果TreeMap中可能包含非数字的字符串键,Long.parseLong()将会抛出NumberFormatException。在这种情况下,你需要更复杂的Comparator来处理异常或定义一个备用排序逻辑(例如,将非数字字符串排在末尾,或者按照字符串长度排序)。

例如,一个更健壮的Comparator可能如下所示:

new TreeMap( (s1, s2) -> {    try {        Long l1 = Long.parseLong(s1);        Long l2 = Long.parseLong(s2);        return l2.compareTo(l1); // 降序    } catch (NumberFormatException e) {        // 处理非数字字符串:例如,将非数字字符串排在数字字符串之后        // 或者根据字符串本身进行字典序比较        boolean isS1Numeric = s1.matches("d+");        boolean isS2Numeric = s2.matches("d+");        if (isS1Numeric && !isS2Numeric) return -1; // s1是数字,s2不是,s1在前        if (!isS1Numeric && isS2Numeric) return 1;  // s1不是数字,s2是,s2在前        // 都是非数字或都是数字(但前面已处理),按字符串本身比较        return s2.compareTo(s1); // 对于非数字字符串也尝试降序    }});

性能考量:在每次比较时都进行Long.parseLong()操作可能会带来一定的性能开销,尤其是在TreeMap包含大量元素或频繁进行插入/删除操作时。对于性能敏感的场景,可以考虑:

如果键的数量是固定的,可以先将键解析为Long,然后存储在TreeMap中,但根据原问题,键必须保持String类型。预处理:在将数据放入TreeMap之前,如果可能,可以先对数据进行一次排序,或者使用一个辅助的数据结构来存储解析后的Long值。

其他排序需求:如果需求是根据字符串的长度进行降序排序,当长度相同时再按数值降序,Comparator可以这样构建:

new TreeMap(Comparator    .comparingInt((String s) -> s.length()) // 首先按长度升序    .thenComparingLong((String s) -> Long.parseLong(s)) // 长度相同,按数值升序    .reversed() // 最后反转整个顺序,实现长度降序,数值降序);

或者更直接的实现:

new TreeMap((s1, s2) -> {    int lengthCompare = Integer.compare(s2.length(), s1.length()); // 长度降序    if (lengthCompare != 0) {        return lengthCompare;    }    return Long.compare(Long.parseLong(s2), Long.parseLong(s1)); // 数值降序});

总结

TreeMap是一个功能强大的有序映射,但其默认的排序行为可能不总是符合我们的特定需求。通过提供一个自定义的Comparator,我们可以完全控制键的排序逻辑。对于String类型的键,当它们代表数值时,利用Comparator.comparingLong()结合reversed()方法是实现数值降序排序的简洁高效方案。在实际应用中,务必考虑非数字字符串的处理和潜在的性能影响,并根据具体需求灵活调整Comparator的实现。

以上就是Java TreeMap 字符串键的自定义数值降序排序指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1070074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
sqlserver中软件版本号进行字符串对比比较大小
上一篇 2025年12月2日 06:34:23
京东:已有超1亿用户在京东购买Apple产品 iPhone 15最高优惠2150元
下一篇 2025年12月2日 06:34:24

相关推荐

  • 铁路12306怎么找回密码_铁路12306密码找回方式

    12306忘记密码可通过四种方式找回:①App内选择人脸识别,输入证件信息并完成刷脸验证后重置;②选择手机号验证,输入注册手机号、证件信息及短信验证码后设置新密码;③选择邮箱找回,提交邮箱信息后查收12306邮件并点击链接重置密码;④本人持有效身份证件前往车站窗口办理密码重置。 如果您在尝试登录铁路…

    2026年8月27日
    000
  • 高级垃圾收集技术和最佳实践

    应用程序性能问题常常源于关键流程失败,这在Java应用中尤为突出。有效的性能监控和调优对于系统稳定运行至关重要,而垃圾收集(GC)日志是诊断和解决性能瓶颈的关键信息来源。 深入Java高级GC技术 GC监控和调优并非难事,但需要对GC机制和JVM内存模型有深入理解。这包括获取和分析GC日志,并根据日…

    2026年8月27日
    000
  • 如何优雅地在LaravelBlade视图中使用图标?mallardduck/blade-boxicons助你轻松搞定!

    可以通过一下地址学习composer:学习地址 在现代 web 应用中,图标扮演着不可或缺的角色。它们不仅能美化界面,还能直观地传达信息,提升用户交互体验。然而,对于 laravel 开发者来说,将图标整合到 blade 视图中,却常常伴随着一些“甜蜜的烦恼”。 还记得那些日子吗?为了在项目中引入一…

    用户投稿 2026年8月27日
    000
  • 飞翔号数字人带货运营全攻略(附入门教程+实用工具资料)

    飞翔号数字人带货是利用ai驱动的虚拟主播进行电商直播的全链条模式,需从形象搭建、脚本策划、技术对接到数据分析系统推进;2. 成功关键在于数字人形象与品牌调性一致,优先选择定制化形象以增强辨识度;3. 内容脚本必须由人工深度润色,注入情感与互动设计,避免生硬ai腔;4. 技术上需稳定对接obs等推流工…

    2026年8月27日
    100
  • Python-科学计算-pandas-17-对某些列或行运算

    Python-科学计算-pandas-17-对某些列或行运算Python-科学计算-pandas-17-对某些列或行运算Python-科学计算-pandas-17-对某些列或行运算Python-科学计算-pandas-17-对某些列或行运算

    本文将介绍如何使用python的科学计算库pandas对dataframe的特定列或行进行运算,适用于windows 7系统,使用anaconda3-4.3.0.1和pycharm-community-2016.3.2编辑器,以及pandas版本0.19.2。 场景描述 假设我们有一个名为df_1的…

    2026年8月27日 用户投稿
    100
  • 英伟达黄仁勋:任何轻视华为的人都 Deeply Naive(极其天真)

    感谢网友 r 的线索支持! 7 月 16 日消息,根据新浪科技报道,英伟达创始人黄仁勋于 7 月 16 日在北京召开了媒体见面会。会上,黄仁勋表示,任何低估华为、低估中国制造实力的人,都是极其天真(Deeply Naive)。 黄仁勋表示:这是一家非常有实力的企业,他曾见证华为过去所创造的技术成果。…

    2026年8月27日
    000
  • VSCode怎么用NodeJS联想_VSCode配置Node.js智能提示与自动补全功能教程

    VSCode在Node.js项目中实现智能提示的核心是通过jsconfig.json或tsconfig.json配置文件,结合@types类型定义和语言服务解析代码结构。正确设置module、target、baseUrl、paths等选项,并安装对应@types包,可显著提升代码联想准确性;对于无类…

    2026年8月27日
    100
  • 荣耀获 MWC2024 最佳产品大奖 中国企业时隔五年再次夺冠

    中国科技企业荣耀旗下产品荣耀 magic v2 rsr 在 2024 年 2 月 29 日闭幕的世界移动通信大会(mwc)上获得了 ” 最佳产品大奖 “:glomo best in show。这是自 2019 年 2 月华为 mate x 荣获该奖项以来,中国科技企业再次获此…

    2026年8月27日
    000
  • 点淘优惠活动哪里多_点淘优惠活动哪里多才能买到最划算商品

    答案:通过直播间专享券、点淘领券中心、限时活动、88VIP权益及返利平台可系统获取高折扣。具体为:1. 直播间领取主播发放的限量大额券;2. 使用点淘“领券中心”聚合页面一键领取可叠加优惠;3. 参与“超级秒杀”等主题活动享跨店满减;4. 绑定88VIP获折上折与专属券;5. 借助高省、氧券等返利平…

    2026年8月27日
    000
  • Laravel与搜索引擎(Elasticsearch等)集成

    laravel通过scout-elasticsearch-driver包与elasticsearch集成,实现全文搜索功能。1. 使用scout与elasticsearch同步eloquent模型数据。2. 通过事件监听机制实时更新elasticsearch索引。3. 使用elasticsearch…

    2026年8月27日
    000
  • 怎样用免费工具做教育PPT_免费教育PPT制作的详细方法

    1、使用AI生成平台如AiPPT,输入主题即可快速创建结构完整、视觉美观的课件,支持导出PPTX或PDF;2、利用WPS Office等办公套件的免费模板与智能配色功能,手动编辑并分享教学内容;3、通过亿图脑图MindMaster将思维导图一键转为PPT,确保逻辑清晰并增强课堂互动。 如果您需要为教…

    2026年8月27日
    000
  • MIKU应援战力空前!ROG夜神RTX5080RO姬x初音未来版显卡

    MIKU应援战力空前!ROG夜神RTX5080RO姬x初音未来版显卡MIKU应援战力空前!ROG夜神RTX5080RO姬x初音未来版显卡MIKU应援战力空前!ROG夜神RTX5080RO姬x初音未来版显卡MIKU应援战力空前!ROG夜神RTX5080RO姬x初音未来版显卡

    今年bilibiliworld现场,华硕正式推出rog astral夜神rtx5080 ro姬 x 初音未来联名版显卡!这款全新定制产品完美融合二次元文化与顶级电竞性能,深度诠释玩家对虚拟偶像的热爱与对极致游戏体验的追求,诚意十足,实力强悍,畅享高帧无忧游戏新境界! ROG ASTRAL夜神RTX5…

    2026年8月27日 用户投稿
    000
  • 告别模块依赖地狱:ComposerConstrainer如何解决Spryker项目升级难题

    在 Spryker 项目中,模块化架构是其核心特性之一。然而,随着项目的不断发展,对核心模块的扩展和定制化也变得越来越普遍。这种定制化虽然带来了灵活性,但也引入了新的挑战:如何确保在升级 Spryker 版本时,这些定制化的模块能够与新版本兼容? 通常, composer.json 文件中使用 ^ …

    用户投稿 2026年8月27日
    000
  • Win8电脑烟雾头如何调的最清楚?

    Win8电脑烟雾头如何调的最清楚?Win8电脑烟雾头如何调的最清楚?Win8电脑烟雾头如何调的最清楚?Win8电脑烟雾头如何调的最清楚?

    CF是每个人都非常喜欢的游戏。在其中战斗时,它将使用烟雾弹。许多人必须调整烟头才能见到敌人。那么如何在Win8中最清晰地调节烟度呢? 其实很简单,让我教你如何调节Win8烟头。   方法 教程  1。右键单击桌面的空白区域以打开菜单,然后选择NVIDIA控制面板。如果没有,则可以在控制面板中找到它。…

    2026年8月27日 用户投稿
    000
  • TXT小说阅读时卡顿怎么解决_TXT小说阅读器卡顿优化设置方法

    先从阅读器设置优化,再处理大文件和设备资源。关闭拼写检查、动画效果,改为手动计算模式;将大TXT分割或转为EPUB格式;关闭后台程序、清理存储、重启设备以释放资源。 读TXT小说时卡顿,多半是软件处理大文件或设备资源不足导致的。关键在于减轻阅读器的负担,让系统能流畅运行。下面这些方法,从设置到操作都…

    2026年8月27日
    000
  • 2025年小红书合规引流全攻略:5大方法让私域用户量暴涨300%不踩雷

    2025年小红书合规引流核心在于深度内容种草、评论区与私信的隐性引导、主页软性布局、直播活动承接及联名合作裂变,需规避直接留联系方式、过度营销等雷区,算法偏好真实互动与解决问题的内容,通过追踪私域转化数据并持续优化策略实现用户暴涨。 2025年,要在小红书上做到合规引流,让私域用户量真正爆发,核心在…

    2026年8月27日
    000
  • 避免命令行输出被其他线程打印信息中断

    本文旨在解决多线程环境下,命令行交互过程中,其他线程的输出信息干扰用户输入的问题。文章将阐述为何无法完全阻止此类中断,并提供几种可行的解决方案,包括重定向输出、使用命名管道以及利用 curses 库进行多线程控制台程序设计。 在多线程 Java 程序中,当一个线程(例如主线程)通过 Scanner.…

    2026年8月27日
    000
  • 抖音电商在哪里设置受限地区?抖音电商商家版

    随着抖音电商的迅速发展,越来越多的商家和内容创作者加入其中,拓展自己的销售渠道。但你是否知道?在抖音电商中,商家是可以自主设置商品销售的受限地区的!通过这一功能,能够有效管理发货范围、规避区域政策风险,并提升运营效率。那么,抖音电商的受限地区究竟在哪里设置?接下来,就为你全面解析操作流程和相关要点。…

    2026年8月27日
    000
  • Win10 强势反弹:霸占七成 Windows 市场份额

    statcounter 的统计数据显示,windows 11 的市场占有率正在逐步下降,到了今年4月份,其份额已经跌破了26%。与此同时,windows 10 显示出回升迹象,增加了0.96个百分点,达到了70.03%,这也是自2023年9月以来首次重返70%以上。不少用户表示,他们更倾向于选择 w…

    2026年8月27日
    000
  • qq浏览器怎么批量删除重复的收藏夹_QQ浏览器重复收藏夹批量清理技巧

    首先使用QQ浏览器内置整理功能可快速批量删除重复书签,进入收藏夹后点击整理选项,系统自动扫描并允许勾选删除重复项;若重复较多,建议导出收藏夹为HTML文件,通过电脑端Excel或文本工具提取网址并删除重复内容,再重新导入;还可借助第三方书签管理工具如Raindrop.io导入数据,利用其智能识别功能…

    2026年8月27日
    100

发表回复

登录后才能评论
关注微信