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

多字段排序工具类,支持树形

多字段排序工具类,用于对包含多个字段的列表进行自定义排序,默认字段S_SORT_NO
支持树形,树形格式为1.1 1.1.1 1.1.2格式
image

public class MultiFieldSorter {/*** @param dataList  数据列表* @param sortRules 排序规则* @param treeTable 树形标记* @Description 根据提供的排序规则对数据列表进行多字段排序。* @author Andawell信息技术* @date 2025-05-26*/public static void sort(List<Map<String, Object>> dataList, List<Map<String, String>> sortRules, boolean treeTable) {if (dataList == null) {return;}Comparator<Map<String, Object>> comparator;if (sortRules == null || sortRules.isEmpty()) {// 默认排序 树形子表 s_sort_no 的值有点 如1.1.1 1.1.2 1.2.1 1.2.2 以此类推 非树形子表直接按照s_sort_no排序comparator = createComparator(treeTable);} else {// 使用Comparator链式调用构建多字段排序comparator = sortRules.stream().map(rule -> createComparator(rule.get(SipdmConstant.FIELD), rule.get("sort"))).reduce(Comparator::thenComparing).orElse((o1, o2) -> 0);}// 执行排序dataList.sort(comparator);}/*** @param treeTable 树表* @return {@link Comparator }<{@link Map }<{@link String }, {@link Object }>>* @Description 默认排序比较器* @author Andawell信息技术* @date 2025-05-27*/private static Comparator<Map<String, Object>> createComparator(boolean treeTable) {return new Comparator<Map<String, Object>>() {@Overridepublic int compare(Map<String, Object> m1, Map<String, Object> m2) {Object v1 = m1.get(TableFeildsEnum.S_SORT_NO.getField().toUpperCase());Object v2 = m2.get(TableFeildsEnum.S_SORT_NO.getField().toUpperCase());if (v1 == null || v2 == null) {return 0;}// 根据是否树形表选择不同的比较策略if (treeTable) {return compareHierarchical(v1.toString(), v2.toString());} else {return compareNumeric(v1.toString(), v2.toString());}}/*** @param s1 字符串1* @param s2 字符串2* @return int 返回值* @Description 树形层级编号比较* @author Andawell信息技术* @date 2025-05-27*/private int compareHierarchical(String s1, String s2) {String[] parts1 = s1.split("\\.");String[] parts2 = s2.split("\\.");int maxLength = Math.max(parts1.length, parts2.length);for (int i = 0; i < maxLength; i++) {int num1 = i < parts1.length ? Integer.parseInt(parts1[i]) : 0;int num2 = i < parts2.length ? Integer.parseInt(parts2[i]) : 0;int result = Integer.compare(num1, num2);if (result != 0) {return result;}}return 0;}/*** @param s1 字符串1* @param s2 字符串2* @return int 返回值* @Description 非树形数值比较* @author Andawell信息技术* @date 2025-05-27*/private int compareNumeric(String s1, String s2) {try {double num1 = Double.parseDouble(s1);double num2 = Double.parseDouble(s2);return Double.compare(num1, num2);} catch (NumberFormatException e) {// 如果无法转换为数字,退回到字符串比较return s1.compareTo(s2);}}};}/*** @param field 字段* @param sort  排序* @return {@link Comparator }<{@link Map }<{@link String }, {@link Object }>>* @Description 根据规则创建比较器* @author Andawell信息技术* @date 2025-05-27*/private static Comparator<Map<String, Object>> createComparator(String field, String sort) {return (o1, o2) -> {Object value1 = o1.get(field);Object value2 = o2.get(field);// 处理null值if (value1 == null && value2 == null) {return 0;}if (value1 == null) {return "asc".equalsIgnoreCase(sort) ? -1 : 1;}if (value2 == null) {return "asc".equalsIgnoreCase(sort) ? 1 : -1;}// 处理Comparable类型if (value1 instanceof Comparable && value2 instanceof Comparable) {@SuppressWarnings("unchecked")int result = ((Comparable<Object>) value1).compareTo(value2);return "desc".equalsIgnoreCase(sort) ? -result : result;}// 非Comparable类型转为String比较int result = value1.toString().compareTo(value2.toString());return "desc".equalsIgnoreCase(sort) ? -result : result;};}
}
http://www.zskr.cn/news/1464.html

相关文章:

  • 同城黑卡小程序系统介绍
  • 365 快乐农场小程序介绍
  • 23Java基础之File
  • Linux GNU 工具集详解
  • 国产DevOps工具链崛起:Gitee如何重塑企业研发效能版图
  • docker部署ruoyi-cloud验证码问题记录
  • 【初赛】ip地址 - Slayer
  • 2025年物流行业CRM解决方案全解析:数字化时代的客户关系管理新范式 - SaaS软件
  • 记一次“若依微服务”启动系统模块时连不上nacos的问题
  • Qt/C++切换街道图/卫星图/混合图/设置不同的地图样式/支持各种地图
  • 为时序数据库 IoTDB 底层架构“保驾护航”,来听听新晋 Committer 的贡献心路!
  • onshape
  • RAG(检索增强生成)是什么?为什么很多 AI 产品都用它?
  • 跨域——CORS详解
  • TIA博图的三种视图
  • 智能CRM赋能饮料行业:纷享销客快消品全场景数字化解决方案
  • 调一调
  • 【稳定检索|线上线下参会|马理工主办】第十一届建筑、土木与水利工程国际学术会议(ICACHE 2025)
  • 多版本jdk环境下,指定jdk版本执行jar文件
  • 基于Python+Vue开发的医院门诊预约挂号系统源码+运行
  • 2025.9.8 总结
  • qoj10096 Generating Random Trees
  • PHP 轻松处理千万行数据 内存不爆,服务器不卡
  • BongoCat - 可爱的桌面互动猫咪
  • 读人形机器人07零售行业
  • 2014年11月微软安全更新风险评估与技术解析
  • [Flink] Flink 经典场景:数据流输出到多个Sink
  • 【ChipIntelli 系列】SDK详解4——Makefile 设置 单SDK多工程文件夹实现方法
  • Codeforces Round 1049 (Div. 2)
  • java学习起航喽