当前位置: 首页 > 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.wxhsa.cn/company.asp?id=38

相关文章:

  • 鸿蒙 HAP 包处理全攻略:从解包到签名,So 库加固一步到位
  • 关于vue在PC端,rem对不同屏幕进行适配
  • GreatSQL分页查询优化案例实战
  • 技术面:Java并发(线程同步、死锁、多线程编排)
  • vue3中两对容易搞混的概念
  • LoadRunner 对 WebTours 实现订票的性能分析
  • mac一键关闭chrome自动更新
  • Python游戏开发:使用Pygame库的全面教程
  • 同城黑卡小程序系统介绍
  • 限行提醒小程序介绍
  • 365 快乐农场小程序介绍
  • AP聚类算法实现三维数据点分类
  • 政务预约系统介绍
  • 23Java基础之File
  • 猜灯谜赢大奖系统介绍
  • Linux GNU 工具集详解
  • 基于MATLAB的多输入多输出空时分组码通信系统仿真
  • 国产DevOps工具链崛起:Gitee如何重塑企业研发效能版图
  • docker部署ruoyi-cloud验证码问题记录
  • 【初赛】ip地址 - Slayer
  • 【初赛】反码 补码 原码 - Slayer
  • 本土开发者生态崛起:Gitee如何重塑中国软件研发基础设施
  • Eclipse中创建Maven多模块工程
  • .net code 连接SAP HANA 数据库
  • 面试题记录:分库分表
  • 2025年物流行业CRM解决方案全解析:数字化时代的客户关系管理新范式 - SaaS软件
  • CentOS 上独立编译 Linux 内核一般性流程
  • 西门子分布式IO从站与主站的PN连接
  • 为时序数据库 IoTDB 底层架构“保驾护航”,来听听新晋 Committer 的贡献心路!
  • VU9P板卡设计方案:565-基于VU9P的32@ SFP28+4@ QSFP28路光纤交换板卡