List集合按元素某属性排序 工具类

package com.videtek.vacp.common.utils;

import com.videtek.vacp.manage.common.utils.StringUtils;

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

/**
 * @author hehaifeng
 * @date 2018-6-6 19:43:55
 * @version 1.0
 *作用:用于对list里面的元素按照该元素的某一个属性进行ASCII编码排序
 */
public class ComparatorUtil implements Comparator<Object> {

    /**
     * 倒序排序
     */
    private static final String DESC ="desc";
    /**
     * 正序排序
     */
    private static final String ASC ="asc";

    /**
     * 排序字段
     */
    String orderBy=null;
    /**
     * 排序方式
     */
    String orderType="desc";

    /**
     * 构造函数
     */
    public ComparatorUtil(String orderBy,String orderType){
        this.orderBy=orderBy;
        this.orderType=orderType;
    }

    /**
     *  对list 集合进行排序
     * @param list  要排序的list集合
     * @param orderBy  要排序的字段:list集合里元素的某一个属性
     * @param orderType  排序方式:倒序:desc   正序:asc
     */
    public static void orderList(List list, String orderBy, String orderType){
        if (list!=null&&list.size()>1&&StringUtils.isNotBlank(orderBy)&&StringUtils.isNotBlank(orderType)){
            Collections.sort(list, new ComparatorUtil(orderBy,orderType));
        }
    }

    /**
     * 主要排序方法
     * @param o1  元素1
     * @param o2  元素2
     * @return  o1>o2  返回值大于0  o1=o2 返回值等于0  o1<o2 返回值小于0
     */
    @Override
    public int compare(Object o1, Object o2) {
        Map<String,String> obj1 =null;
        Map<String,String> obj2 =null;
        // 将对象统一转成Map集合便于操作
        try {
            obj1 = ObjectToMapUtil.objectToMap(o1);
            obj2 = ObjectToMapUtil.objectToMap(o2);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            // 如果转map集合异常则不排序
            return 0;
        }
        // 如果传值为 desc 则倒序排序
        if (DESC.equals(orderType)){
            // 如果传值为 desc 则倒序排序
            return isMoreThan(obj1.get(orderBy), obj2.get(orderBy))?-1:1;
        }else if(ASC.equals(orderType)){
            // 如果传值为 asc 则正序排序
            return isMoreThan(obj1.get(orderBy), obj2.get(orderBy))?1:-1;
        } else {
            // 如果传其他值则不排序
          return 0;
        }
    }


    private  boolean isMoreThan(String pre, String next){
        if(null == pre || null == next || "".equals(pre) || "".equals(next)){
            return false;
        }
        char[] c_pre = pre.toCharArray();
        char[] c_next = next.toCharArray();

        int minSize = Math.min(c_pre.length, c_next.length);

        for (int i = 0; i < minSize; i++) {
            if((int)c_pre[i] > (int)c_next[i]){
                return true;
            }else if((int)c_pre[i] < (int)c_next[i]){
                return false;
            }
        }
        if(c_pre.length > c_next.length){
            return true;
        }
        return false;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值