排序工具类 - SortUtils

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值