当前位置: 首页 > news >正文

编写TreeMap自定义排序的插曲

上周有个需求,内容是将从数据库中查出的数据进行排序,作为导出Excel的sheet名进行输出,分析数据发现,返回值是List<Map<String,Object>>,项目中的代码是现将List中的数据选择性放存放到TreeMap<String,String>中,使用TreeMap中的特性做到有序输出;但是原开发者没有意识到如下情况:当查询条件为A时,查询的数据是Number(4,0);当查询条件为B时,查询的数据是varchar(255)。这样就出现原来1,2,3,11的顺序输出后变成了"1","12","2","3"。

最终代码如下:

 public static TreeMap<String, String> createTreeMap() {Comparator<String> comparator = new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {try {Integer i1 = Integer.parseInt(o1);Integer i2 = Integer.parseInt(o2);return i1.compareTo(i2);} catch (Exception e) {int length = o1.length() - o2.length();return length !=0 ? length :o1.compareTo(o2);}}};return new TreeMap<String, String>(comparator);}

在这次编写代码过程中,出现了一个问题,本来在catch后直接return -1,结果再取出值的时候出现了问题:

 public static TreeMap<String, String> createTreeMap() {Comparator<String> comparator = new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {try {Integer i1 = Integer.parseInt(o1);Integer i2 = Integer.parseInt(o2);return i1.compareTo(i2);} catch (Exception e) {return -1;}}};return new TreeMap<String, String>(comparator);
}public static void main(String[] args) {List<Map<String,Object>> list = new ArrayList<>();TreeMap<String, String> treeMap = createTreeMap();treeMap.put("1a", "1");treeMap.put("11b", "11");treeMap.put("12c", "12");treeMap.put("21d", "21");treeMap.put("2e", "2");treeMap.put("3f", "3");treeMap.put("4g", "4");System.out.println(treeMap);for (String s : treeMap.keySet()) {System.out.println(s+"&&"+ treeMap.get(s));}}

当时特别的郁闷,为什么打印map值的时候,看起来是正常,但是在取值的时候发现key是有值的,但是value全部都是null,超级郁闷呀!

使用AI分析后得出的结论是这样的:

所以写代码不能想当然(查询时候SQL中都已经去重,所以理所当然认为返回-1就没问题了),一定要考虑周全,在满足自定义的逻辑时也要不影响其他的逻辑,不然就会耽误交付时间。

http://www.dtcms.com/a/355602.html

相关文章:

  • 信号量使用流程
  • 多媒体内容智能检索技术进展
  • [特殊字符] ​​MySQL性能参数查询总结​
  • 146-延长无线传感器网络生命周期的睡眠调度机制的混合元启发式优化方法!
  • [RK3576][Android14] Android->添加以太网MAC地址选项
  • Spring Boot 实战:接入 DeepSeek API 实现问卷文本优化
  • FFmpeg 实战:从零开始写一个简易视频播放器
  • 视频层和叠加层
  • 数据结构:冒泡排序 (Bubble Sort)
  • Android14 USB子系统的启动以及动态切换相关的init.usb.rc详解
  • mysql主从复制GTID模式
  • Day16_【机器学习—模型拟合问题】
  • AI智能能源管理系统深度剖析:从工业节能到数据中心降耗,解锁企业降本减排新方案
  • Docker 40个自动化管理脚本-1 (20/40)
  • CVPR2019 Oral论文《Side Window Filtering》解读及算法 Python 实现
  • 网络编程3-UDP协议
  • Megatron-Energon 和 Megatron-LM
  • 解锁五大联赛数据:API技术指南
  • Python在AI与数据科学工作流中的新角色:2025年实践指南
  • X-AnyLabeling:Win10上安装使用X-AnyLabeling标注工具
  • 国内永久免费云服务器有哪些?
  • AI视频生成工具全景对比:元宝AI、即梦AI、清影AI和Vidu AI
  • Java学习笔记之——通过分页查询样例感受JDBC、Mybatis以及MybatisPlus(一)
  • CPU、进程、线程上下文切换
  • 使用Rag 命中用户feedback提升triage agent 准确率
  • 特斯拉 Tesla FSD 12.6.4,FSD14, VLA 和 华为 ADS 4.0 比较
  • 广东省省考备考(第八十九天8.28)——判断推理(第九节课)
  • 智能客服多智能体(知识库问答+情绪感知+工单路由)
  • 玄机靶场 | 第九章-blueteam 的小心思3
  • openEuler中LVM调整实现home与root分区空间平衡