博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 代码排序
阅读量:5888 次
发布时间:2019-06-19

本文共 3323 字,大约阅读时间需要 11 分钟。

hot3.png

     

package com.mta.elusx.modules.cs.utils;

import java.lang.reflect.Method;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONException;

import com.mta.redis.RedisUtil;

public class SortUtil {
     /**
     * 装载已经用过的规则 实现类似单例模式
     */
    private static Map<String, SortUtil> sortMap = new HashMap<String, SortUtil>();

    private Method[] methodArr = null;

    private int[] typeArr = null;

    /**

     * 构造函数 并保存该规则
     * 
     * clazz
     * args
     */
    private <T> SortUtil(Class<T> clazz, String... args) {
        methodArr = new Method[args.length];
        typeArr = new int[args.length];
        for (int i = 0; i < args.length; i++) {
            String key = args[i].split("#")[0];
            try {
                methodArr[i] = clazz.getMethod(key, new Class[] {});
                typeArr[i] = Integer.valueOf(args[i].split("#")[1]);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }

    }

    
    /**
     * 排序规则
     * 
     * hgs 2017-12-12
     */
    private Comparator<Object> comparator = new Comparator<Object>() {
       
        public int compare(Object o1, Object o2) {
            for (int i = 0; i < methodArr.length; i++) {
                try {
                    Object value1 = methodArr[i].invoke(o1);
                    Object value2 = methodArr[i].invoke(o2);
                    double double1 = 0;
                    double double2 = 0;

                    if (value1 instanceof Integer) {

                        double1 = (Integer) value1;
                        double2 = (Integer) value2;
                    } else if (value1 instanceof Boolean) {
                        double1 = (Boolean) value1 ? 1 : -1;
                        double2 = (Boolean) value2 ? 1 : -1;
                    } else if (value1 instanceof Double) {
                        double1 = (Double) value1;
                        double2 = (Double) value2;
                    } else if (value1 instanceof Float) {
                        double1 = (Float) value1;
                        double2 = (Float) value2;
                    } else if (value1 instanceof Long) {
                        double1 = (Long) value1;
                        double2 = (Long) value2;
                    } else {
                        double1 = value1.toString().compareToIgnoreCase(
                                value2.toString());
                        double2 = -double1;
                    }
                    if (double1 == double2) {
                        continue;
                    }
                    if (typeArr[i] == 1) {
                        return (double1 > double2) ? 1 : -1;
                    } else {
                        return (double1 > double2) ? -1 : 1;
                    }
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
            return 0;
        }
    };

    /**

     * 获取排序规则 hgs 2017-12-12
     * 
     * @return SortUtil
     * @author chenjy
     */
    private static <T> SortUtil getSort(Class<T> clazz, String... args) {
        String key = clazz.getName() + Arrays.toString(args);
        if (sortMap.containsKey(key)) {
            return sortMap.get(key);
        } else {
            SortUtil sort = new SortUtil(clazz, args);
            sortMap.put(key, sort);
            return sort;
        }
    }

    /**

     * <pre>
     * 首先会在容器中,根据class+规则去找。如果没有见则new 
     * 调用方式 SortUtil.sort(list,"方法名#升序(1)/降序(-1)","..","..")
     * 后面字符串参数:比如:"getMark#1","getAge#-1"
     * 表示先按照getMark的值按照升序排,如果相等再按照getAge的降序排
     * 如果返回值是true类型,若按照true先排:"isOnline#1" ,若按照false先排:"isOnline#-1"
     * </pre>
     * 
     * @author hgs 2017-12-12
     * @param list
     * @param args
     */
    public static <T> void sort(List<T> list, String... args) {
        if (list == null || list.size() == 0 || args.length == 0) {
            return;
        }
        SortUtil sort = getSort(list.get(0).getClass(), args);
        Collections.sort(list, sort.comparator);
    }

    /**

     * 给Map进行排序 对map的value进行排序
     * 
     * @ @author hgs 2017-12-12
     * @param map
     *            被排序的map
     * @param args
     *            排序方法条件:方法名x#1升序-1倒序, 方法名y#-1倒序
     * @return List<T>
     */
    public static <T, F> List<F> sortMap(Map<T, F> map, String... args) {
        List<F> list = new ArrayList<F>();
        if (map == null || map.isEmpty()) {
            return list;
        }
        list.addAll(map.values());
        sort(list, args);
        return list;
    }
}

转载于:https://my.oschina.net/huangguangsheng/blog/1588491

你可能感兴趣的文章
数据驱动销售——个性化推荐引擎
查看>>
C语言标准库函数qsort那点小事
查看>>
HL7 CDA高级培训
查看>>
Android 调用照相机拍照
查看>>
linux的C获取shell执行返回的结果
查看>>
关于spring mybateis 定义resultType="java.util.HashMap"
查看>>
程序员怎么留住健康?
查看>>
(转)C# 把我所积累的类库全部分享给博友(附件已经上传)
查看>>
Silverlight5 无法切换输入法,无法输入中文的原因及解决初探
查看>>
游戏开发基础:方向键的组合,八方向实现
查看>>
黑书-DP-方块消除 ****
查看>>
MySQL 分区
查看>>
我的架构经验系列文章 - 后端架构 - 语言层面
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
读取手机硬件信息
查看>>
一致哈希
查看>>
The connection to adb is down, and a severe error has occured. 问题解决
查看>>
在Jenkins中配置运行远程shell命令
查看>>
代码杂记
查看>>
linux中防CC攻击两种实现方法(转)
查看>>