多字段排序工具类,用于对包含多个字段的列表进行自定义排序,默认字段S_SORT_NO
支持树形,树形格式为1.1 1.1.1 1.1.2格式
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;};}
}