首页 > 其他分享 >排序工具类 - SortUtils

排序工具类 - SortUtils

时间:2024-08-01 20:55:08浏览次数:13  
标签:null return SortUtils list sortMap result 工具 排序

package com.kurumi.util;

import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class SortUtils {

    /**
     * 将 list 安装 sortMap 中的传参排序
     * @param list 需要排序列表
     * @param sortMap key 为需要排序字段, value 中升序asc, 降序desc
     * @param <T> 列表元素类型
     */
    public static <T> void sort(List<T> list, Map<String, String> sortMap) {
        if (list == null || list.isEmpty() || sortMap == null || sortMap.isEmpty()) {
            return;
        }

        // 定义一个比较器
        Comparator<T> comparator = new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                int result = 0; // 比较结果,默认为 0,即相等
                for (Map.Entry<String, String> entry : sortMap.entrySet()) {
                    String key = entry.getKey();
                    String order = entry.getValue().toLowerCase();
                    try {
                        Comparable<Object> value1 = (Comparable<Object>) o1.getClass().getMethod(getter(key)).invoke(o1);
                        Comparable<Object> value2 = (Comparable<Object>) o2.getClass().getMethod(getter(key)).invoke(o2);
                        // 检查排序字段值是否为空
                        if (value1 == null || value2 == null) {
                            // 根据排序顺序将空值放在首位或末尾
                            if (value1 == null && value2 == null) {
                                result = 0; // 如果两个值都为空,则认为它们相等
                            } else if (value1 == null) {
                                result = order.equalsIgnoreCase("desc") ? -1 : 1;
                            } else { // value2 == null
                                result = order.equalsIgnoreCase("desc") ? 1 : -1;
                            }
                        } else {
                            result = value1.compareTo(value2);
                        }
                        if (result != 0) {
                            return order.equalsIgnoreCase("desc") ? -result : result;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                return result;
            }
        };

        // 排序
        list.sort(comparator);
    }

    // 根据属性名获取 getter 方法名称
    private static String getter(String fieldName) {
        if (fieldName == null || fieldName.length() == 0) {
            return null;
        }
        return "get" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
    }
}

标签:null,return,SortUtils,list,sortMap,result,工具,排序
From: https://blog.csdn.net/Start1234567/article/details/140857197

相关文章

  • 冒泡排序
    冒泡排序(BubbleSort)冒泡排序是一种简单的交换排序算法。原理冒泡排序的每一趟都需要从第一位开始进行相邻的两个数的比较,将较大的数放在后面,比较完毕之后向后挪一位继续比较下面两个相邻的数的大小关系,重复此步骤,直到最后一个还没归位的数。示例:对数组[3,13,8,11,6,......
  • 冒泡排序
    特点:每一轮排序是将相邻的两个元素比较大小,最终是一个从小到大或者从大到小的有序序列。规律:1、轮次的规律:总共有n个元素,则需要比较n-1次2、每一轮的比较规律:每一轮的比较规律比上一轮-1次代码实现思想:至少需要两个变量参与编码,一个变量控制轮次,一个变量控制每一轮次中比较的次......
  • 打卡信奥刷题(487)用Scratch图形化工具信奥P1161[普及组/提高] 开灯
    开灯题目描述在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,......
  • 冒泡排序的具体思想和算法实现以及改进
    冒泡排序——稳定算法从小到大排序:0~length-1对比a[0]和a[1],如果前一个大于后一个,交换位置。对比a[1]和a[2],如果前一个大于后一个,交换位置。对比a[2]和a[3],如果前一个大于后一个,交换位置。...对比a[length-2]和a[length-1],如果前一个大于后一个,交换位置。第一轮结果下......
  • 选择插入排序改进思路加算法实现
    首先默认第一个元素是已排序的,剩下元素是待排序的,从第二个元素开始遍历取出待排序区域的第一个元素element和已排序区域的最后一个元素a[j]往前开始比较大小若待排元素大于等于最后一个元素则直接跳出循环将待排元素赋值给a[j+1]若待排元素小于最后一个元素将最后一个元......
  • 折半插入排序算法思想及代码实现
    折半插入排序(BinaryInsertionSort)是插入排序算法的一种优化版本。插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。传统的插入排序在寻找插入位置时,采用的是顺序比较的方式,即逐个与有序表中的元素进行比较,直到找到比待插入......
  • 因果图模型:理解因果关系的强大工具
    目录1.引言2.基本概念因果关系vs相关性节点和边的定义有向无环图(DAG)的特点3.因果图模型的组成部分节点(Variables)边(Edges)无环性(Acyclicity)组合起来的因果图模型4.因果图模型的建立如何识别变量及其关系例子:吸烟与肺癌模型验证与调整5.因果推理因果推理的定义和......
  • 某RED书旋转验证码标注工具
    注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路本文的验证码网址如下,使用base64解码获得最近,某书的旋转验证码又更新了,在我之前的文章有讲过利用梯度幅度计算图像边缘变化,然后计算出最合适的角度,如果使用我的代码之后那么这种方法对于小红......
  • 推荐一款好用的刷题工具
    为了帮助正在准备求职季的开发者提升备战效率,阿里云特别推出“通义灵码陪你备战求职季”活动,精心挑选百道历史校招技术面试/笔试题,借助通义灵码智能问答、代码智能生成、代码优化等核心功能,帮助开发者更加准确地了解程序员职业所需的核心技能,加强对问题解决思维和解题能力的练习......
  • 利用Curl命令来发邮件的小工具
    一个利用curl来发送邮件的小工具其实可以扩展出很多其它玩法例如:配合系统定时任务做系统状态监控,当满足一定条件自动发送邮件或者和笔者一样,每次加班后懒得编辑邮件,就可以直接传入相应的参数来发邮件或者...其它可能需要发邮件的场景字段解释USER:邮箱帐号名称及密码,中......