代码中引用的其他类,请Java通用的排序工具类,支持数组、List、Map、Set排序,排序的内容可以是一个java定义的类型也可以是一个对象,根据对象的属性名称或方法名称进行排序(方法名称需要带括号),支持多个字段排序功能、如果对像中用一个map可以根据key排序对象。设置可以排序一个树型结构的对象。具体Demo和使用方法太多了。。将来有机会在补吧。代码中依赖的类参考地址如下:

反射工具类:释放资源、获取对对象属性、设置属性等

Java对象比较、空判断等工具


以下是排序工具类的代码:

排序条件实体类,用于复杂的排序(比如排序一个user.getRole().name这样的对象)

package cn.elwy.common.util.sort;

import java.text.Format;
import java.text.ParsePosition;
import java.util.Comparator;
import java.util.Map;

/**
 * 排序条件实体类
 * @author huangsq
 * @version 1.0, 2014-07-25
 * @since 1.0, 2014-07-25
 */
public class SortCondition {

    /** 是否升序 */
    private boolean isAsc;
    /** 方法名称 */
    private String methodName;
    /** 排序比较器 */
    private Comparator<Object> comparator;
    /** 格式化类 */
    private Format format;
    /** ParsePosition */
    private ParsePosition parsePosition;
    /** 排序的map */
    private Map<?, ?> map;
    /** 是否表格形式获取数据 */
    private boolean isTable;
    /** 排序的map按值排序 */
    private boolean isSortMapByValue;
    /** 如果元素为Map,是否支持方法名作为Key */
    private boolean isSupportMap;

    public SortCondition(boolean isAsc, String methodName) {
        this(isAsc, methodName, null);
    }

    public SortCondition(boolean isAsc, String methodName, Comparator<Object> comparator) {
        this.isAsc = isAsc;
        this.methodName = methodName;
        this.comparator = comparator;
    }

    public boolean isAsc() {
        return isAsc;
    }

    public void setAsc(boolean isAsc) {
        this.isAsc = isAsc;
    }

    public String getMethodName() {
        return methodName;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }

    public Comparator<Object> getComparator() {
        return comparator;
    }

    public void setComparator(Comparator<Object> comparator) {
        this.comparator = comparator;
    }

    public Format getFormat() {
        return format;
    }

    public void setFormat(Format format) {
        this.format = format;
    }

    public ParsePosition getParsePosition() {
        return parsePosition;
    }

    public void setParsePosition(ParsePosition parsePosition) {
        this.parsePosition = parsePosition;
    }

    public Map<?, ?> getMap() {
        return map;
    }

    public void setMap(Map<?, ?> map) {
        this.map = map;
    }

    public boolean isTable() {
        return isTable;
    }

    public void setTable(boolean isTable) {
        this.isTable = isTable;
    }

    public boolean isSortMapByValue() {
        return isSortMapByValue;
    }

    public void setSortMapByValue(boolean isSortMapByValue) {
        this.isSortMapByValue = isSortMapByValue;
    }

    public boolean isSupportMap() {
        return isSupportMap;
    }

    public void setSupportMap(boolean isSupportMap) {
        this.isSupportMap = isSupportMap;
    }

}

排序工具类

package cn.elwy.common.util.sort;

import java.math.BigDecimal;
import java.text.Collator;
import java.text.Format;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.elwy.common.util.AssertUtil;
import cn.elwy.common.util.ReflectUtil;

/**
 * 利用反射机制进行排序工具类,支持数组、List、Set、Map的排序
 * 可以支持多属性排序,支持子对象中的属性排序(例user对象中的role的name属性进行排序,method="getRole.getName")
 * @author huangsq
 * @version 1.0, 2014-07-25
 * @since 1.0, 2014-07-25
 */
public class SortUtil {

    private static Logger logger = LoggerFactory.getLogger(SortUtil.class);
    /** 中文排序 */
    public static final Comparator<Object> CHINA_COMPARATOR = Collator.getInstance(Locale.CHINA);

    private SortUtil() {
    }

    /**
     * 根据指定的比较器排序一个数组中的元素
     * @param arrays 需要排序的数组
     * @param comparator 排序比较器
     */
    public static void sort(Object[] arrays, Comparator<Object> comparator) {
        Arrays.sort(arrays, comparator);
    }

    /**
     * 根据指定的比较器排序一个List中的元素
     * @param list 需要排序的集合
     * @param comparator 排序比较器
     */
    public static void sort(List<?> list, Comparator<Object> comparator) {
        Collections.sort(list, comparator);
    }

    /**
     * 根据指定的比较器排序一个Set中的元素
     * @param set 需要排序的集合
     * @param comparator 排序比较器
     * @return Set TreeSet对象
     */
    @SuppressWarnings("unchecked")
    public static <T> Set<T> sort(Set<?> set, Comparator<Object> comparator) {
        Set<Object> sortSet = new TreeSet<Object>(comparator);
        sortSet.addAll(set);
        return (Set<T>) sortSet;
    }

    /**
     * 根据指定的比较器排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的Map
     * @param comparator 排序比较器
     * @return Map TreeMap对象
     */
    @SuppressWarnings("unchecked")
    public static <K, V> Map<K, V> sort(Map<?, ?> map, Comparator<Object> comparator) {
        Map<Object, Object> sortMap = new TreeMap<Object, Object>(comparator);
        sortMap.putAll(map);
        return (Map<K, V>) sortMap;
    }

    /**
     * 排序一个数组中的元素,元素必需为Java提供的数据类型
     * @param arrays 需要排序的数组
     * @param isAsc 是否升序
     */
    public static void sort(Object[] arrays, boolean isAsc) {
        sort(arrays, getComparator(isAsc));
    }

    /**
     * 排序一个List中的元素,元素必需为Java提供的数据类型
     * @param list 需要排序的集合
     * @param isAsc 是否升序
     */
    public static void sort(List<?> list, boolean isAsc) {
        sort(list, getComparator(isAsc));
    }

    /**
     * 排序一个Set中的元素,元素必需为Java提供的数据类型
     * @param set 需要排序的集合
     * @param isAsc 是否升序
     */
    public static <T> Set<T> sort(Set<?> set, boolean isAsc) {
        return sort(set, getComparator(isAsc));
    }

    /**
     * 根据Map的Key排序一个Map中的元素,Key必需为Java提供的数据类型
     * @param <K, V>
     * @param map 需要排序的map
     * @param isAsc 是否升序
     * @return
     */
    public static <K, V> Map<K, V> sort(Map<?, ?> map, boolean isAsc) {
        return sort(map, getComparator(isAsc));
    }

    /**
     * 根据Map的Value排序一个Map中的元素,Value必需为Java提供的数据类型
     * @param <K, V>
     * @param map 需要排序的map
     * @param isAsc 是否升序
     * @return
     */
    public static <K, V> Map<K, V> sortMapByValue(Map<?, ?> map, boolean isAsc) {
        return sort(map, getComparator(map, isAsc));
    }

    /**
     * 利用java反射机制排序一个对象数组
     * @param arrays 需要排序的数组
     * @param isAsc 是否升序
     * @param fieldName 对象中的方法
     */
    public static void sort(Object[] arrays, boolean isAsc, String fieldName) {
        sort(arrays, getComparator(isAsc, fieldName));
    }

    /**
     * 利用java反射机制排序一个集合对象
     * @param list 需要排序的集合
     * @param isAsc 是否升序
     * @param fieldName 对象中的方法
     */
    public static void sort(List<?> list, boolean isAsc, String fieldName) {
        sort(list, getComparator(isAsc, fieldName));
    }

    /**
     * 利用java反射机制排序一个Set对象
     * @param set 需要排序的集合
     * @param isAsc 是否升序
     * @param fieldName 对象中的方法
     */
    public static <T> Set<T> sort(Set<?> set, boolean isAsc, String fieldName) {
        return sort(set, getComparator(isAsc, fieldName));
    }

    /**
     * 利用java反射机制排序一个map对象,根据Map的Key排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的map
     * @param isAsc 是否升序
     * @param fieldName key对象中的方法
     * @return
     */
    public static <K, V> Map<K, V> sort(Map<?, ?> map, boolean isAsc, String fieldName) {
        return sort(map, getComparator(isAsc, fieldName));
    }

    /**
     * 利用java反射机制排序一个map对象,根据Map的Value排序一个Map中的元素
     * @param <T>
     * @param map 需要排序的map
     * @param isAsc 是否升序
     * @param fieldName 对象中的方法
     * @return
     */
    public static <K, V> Map<K, V> sortMapByValue(Map<?, ?> map, boolean isAsc, String fieldName) {
        return sort(map, getComparator(map, isAsc, fieldName));
    }

    /**
     * 利用java反射机制排序一个对象数组
     * @param arrays 需要排序的数组
     * @param isAsc 是否升序,如果数组下标不足方法参数个数,将按最后一个状态表示后续方法的排序是否升序
     * @param fieldNames 对象中的方法列表
     */
    public static void sort(Object[] arrays, boolean[] isAsc, String... fieldNames) {
        sort(arrays, getComparator(isAsc, fieldNames));
    }

    /**
     * 利用java反射机制排序一个集合对象
     * @param list 需要排序的集合
     * @param isAsc 是否升序,如果数组下标不足方法参数个数,将按最后一个状态表示后续方法的排序是否升序
     * @param fieldNames 对象中的方法列表
     */
    public static void sort(List<?> list, boolean[] isAsc, String... fieldNames) {
        sort(list, getComparator(isAsc, fieldNames));
    }

    /**
     * 利用java反射机制排序一个Set对象
     * @param set 需要排序的集合
     * @param isAsc 是否升序,如果数组下标不足方法参数个数,将按最后一个状态表示后续方法的排序是否升序
     * @param methodNameList 对象中的方法列表
     */
    public static <T> Set<T> sort(Set<?> set, boolean[] isAsc, String... fieldNames) {
        return sort(set, getComparator(isAsc, fieldNames));
    }

    /**
     * 利用java反射机制排序一个map对象,根据Map的Key排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的map
     * @param isAsc 是否升序,如果数组下标不足方法参数个数,将按最后一个状态表示后续方法的排序是否升序
     * @param fieldNames Key对象中的方法列表
     * @return
     */
    public static <K, V> Map<K, V> sort(Map<?, ?> map, boolean[] isAsc, String... fieldNames) {
        return sort(map, getComparator(isAsc, fieldNames));
    }

    /**
     * 利用java反射机制排序一个map对象,根据Map的Value排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的map
     * @param isAsc 是否升序,如果数组下标不足方法参数个数,将按最后一个状态表示后续方法的排序是否升序
     * @param fieldNames 值对象中的方法列表
     * @return
     */
    public static <K, V> Map<K, V> sortMapByValue(Map<?, ?> map, boolean[] isAsc, String... fieldNames) {
        return sort(map, getComparator(map, isAsc, fieldNames));
    }

    /**
     * 根据指定的条件排序一个数组中的元素
     * @param arrays 需要排序的数组
     * @param condition 排序条件
     */
    public static void sort(Object[] arrays, SortCondition condition) {
        sort(arrays, getComparator(condition));
    }

    /**
     * 根据指定的条件排序一个List中的元素
     * @param list 需要排序的集合
     * @param condition 排序条件
     */
    public static void sort(List<?> list, SortCondition condition) {
        sort(list, getComparator(condition));
    }

    /**
     * 根据指定的条件排序一个Set中的元素
     * @param set 需要排序的集合
     * @param condition 排序条件
     * @return Set TreeSet对象
     */
    public static <T> Set<T> sort(Set<?> set, SortCondition condition) {
        return sort(set, getComparator(condition));
    }

    /**
     * 根据指定的比较器排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的Map
     * @param condition 排序条件
     * @return Map TreeMap对象
     */
    public static <K, V> Map<K, V> sort(Map<?, ?> map, SortCondition condition) {
        return sort(map, getComparator(condition));
    }

    /**
     * 根据指定的条件列表排序一个数组中的元素
     * @param arrays 需要排序的数组
     * @param conditionList 条件集,按list先后顺序进行排序
     */
    public static void sort(Object[] arrays, List<SortCondition> conditionList) {
        sort(arrays, getComparator(conditionList));
    }

    /**
     * 根据指定的条件列表排序一个List中的元素
     * @param list 需要排序的集合
     * @param conditionList 条件集,按list先后顺序进行排序
     */
    public static void sort(List<?> list, List<SortCondition> conditionList) {
        sort(list, getComparator(conditionList));
    }

    /**
     * 根据指定的条件列表排序一个Set中的元素
     * @param set 需要排序的Set
     * @param conditionList 条件集,按list先后顺序进行排序
     * @return Set TreeSet对象
     */
    public static <T> Set<T> sort(Set<?> set, List<SortCondition> conditionList) {
        return sort(set, getComparator(conditionList));
    }

    /**
     * 根据指定的条件列表排序一个Map中的元素
     * @param <K, V>
     * @param map 需要排序的Map
     * @param conditionList 条件集,按list先后顺序进行排序
     * @return Map TreeMap对象
     */
    public static <K, V> Map<K, V> sort(Map<?, ?> map, List<SortCondition> conditionList) {
        return sort(map, getComparator(conditionList));
    }

    /**
     * 根据指定的比较器排序一个树形结构的数组对象中的元素
     * @param arrays 需要排序的数组
     * @param comparator 排序比较器
     */
    public static void sortTree(Object[] arrays, Comparator<Object> comparator, String method) {
        if (AssertUtil.isEmpty(arrays)) {
            return;
        }
        sort(arrays, comparator);
        for (Object object : arrays) {
            Object[] child = ReflectUtil.getMethodValue(object, method);
            if (AssertUtil.isNotEmpty(child)) {
                sortTree(child, comparator, method);
            }
        }
    }

    /**
     * 根据指定的比较器排序一个树形结构的List对象中的元素
     * @param list 需要排序的集合
     * @param comparator 排序比较器
     */
    public static void sortTree(List<?> list, Comparator<Object> comparator, String method) {
        if (AssertUtil.isEmpty(list)) {
            return;
        }
        sort(list, comparator);
        for (Object object : list) {
            List<?> child = ReflectUtil.getMethodValue(object, method);
            if (AssertUtil.isNotEmpty(child)) {
                sortTree(child, comparator, method);
            }
        }
    }

    /**
     * 根据排序方式获取Comparator
     * @param isAsc 是否升序
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final boolean isAsc) {
        return new Comparator<Object>() {

            public int compare(Object value1, Object value2) {
                return compareTo(isAsc, value1, value2);
            }
        };
    }

    /**
     * 根据Map的value排序方式获取Comparator
     * @param isAsc 是否升序
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final Map<?, ?> map, final boolean isAsc) {
        return new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                return compareTo(isAsc, map.get(o1), map.get(o2));
            }
        };
    }

    /**
     * 根据方法和排序方式获取Comparator,如果方法名称为空,则不使用反射机制
     * @param isAsc 是否升序
     * @param fieldName 方法名称
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final boolean isAsc, final String fieldName) {
        return new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                Object value1 = null;
                Object value2 = null;
                if (AssertUtil.isEmpty(fieldName)) {
                    value1 = o1;
                    value2 = o2;
                } else {
                    // 利用反射得到具体的值
                    value1 = ReflectUtil.getFieldValue(o1, fieldName);
                    value2 = ReflectUtil.getFieldValue(o2, fieldName);
                }
                return compareTo(isAsc, value1, value2);
            }
        };
    }

    /**
     * 根据方法名称列表和排序方式获取Comparator,方法名称列表不允许为空
     * @param isAsc 是否升序
     * @param methodNameList 方法名称列表,按list先后顺序进行排序
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(boolean[] isAsc, String... methodNames) {
        List<Comparator<Object>> comparatorList = new ArrayList<Comparator<Object>>();
        int index = isAsc.length - 1;
        for (int i = 0; i < methodNames.length; i++) {
            if (i >= index) {
                comparatorList.add(getComparator(isAsc[index], methodNames[i]));
            } else {
                comparatorList.add(getComparator(isAsc[i], methodNames[i]));
            }
        }
        return getComparatorByComparatorList(comparatorList);
    }

    /**
     * 根据Map的value的方法和排序方式获取Comparator
     * @param map 需要排序的map
     * @param isAsc 是否升序
     * @param fieldName Map值对象的方法
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final Map<?, ?> map, final boolean isAsc, final String fieldName) {
        return new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                Object value1 = null;
                Object value2 = null;
                if (AssertUtil.isEmpty(fieldName)) {
                    value1 = o1;
                    value2 = o2;
                } else {
                    // 利用反射得到具体的值
                    value1 = ReflectUtil.getFieldValue(o1, fieldName);
                    value2 = ReflectUtil.getFieldValue(o2, fieldName);
                }
                return compareTo(isAsc, map.get(value1), map.get(value2));
            }
        };
    }

    /**
     * 根据Map的value的方法名称列表和排序方式获取Comparator,方法名称列表不允许为空
     * @param isAsc 是否升序
     * @param methodNameList 值对象的方法名称列表,按list先后顺序进行排序
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final Map<?, ?> map, final boolean[] isAsc, String... fieldNames) {
        final List<Comparator<Object>> comparatorList = new ArrayList<Comparator<Object>>();
        int index = isAsc.length - 1;
        for (int i = 0; i < fieldNames.length; i++) {
            if (i >= index) {
                comparatorList.add(getComparator(map, isAsc[index], fieldNames[i]));
            } else {
                comparatorList.add(getComparator(map, isAsc[i], fieldNames[i]));
            }
        }
        return getComparatorByComparatorList(comparatorList);
    }

    /**
     * 根据排序条件获取Comparator,如果方法名称为空,则不使用反射机制
     * @param condition 排序条件
     * @return Comparator 排序比较器
     */
    public static Comparator<Object> getComparator(final SortCondition condition) {
        return new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                Object value1 = null;
                Object value2 = null;

                String methodName = condition.getMethodName();
                Map<?, ?> map = condition.getMap();
                if (map != null) { // 排序一个Map中的元素
                    if (condition.isSortMapByValue()) { // 根据value排序
                        value1 = map.get(o1);
                        value2 = map.get(o2);
                    } else { // 根据Key排序
                        value1 = o1;
                        value2 = o2;
                    }
                } else if (AssertUtil.isEmpty(methodName)) { // 方法名称为空,直接比较两个对象
                    value1 = o1;
                    value2 = o2;
                } else if (condition.isTable()) {
                    value1 = ReflectUtil.getTableColumnValue(o1, methodName, condition.isSupportMap());
                    value2 = ReflectUtil.getTableColumnValue(o2, methodName, condition.isSupportMap());
                } else {
                    value1 = ReflectUtil.getTreeColumnValue(o1, methodName, condition.isSupportMap());
                    value1 = ReflectUtil.getTreeColumnValue(o2, methodName, condition.isSupportMap());
                }
                try {
                    Format format = condition.getFormat();
                    if (format != null) {
                        if (condition.getParsePosition() != null) {
                            value1 = format.parseObject(value1.toString(), condition.getParsePosition());
                            value2 = format.parseObject(value2.toString(), condition.getParsePosition());
                        } else {
                            value1 = format.parseObject(value1.toString());
                            value2 = format.parseObject(value2.toString());
                        }
                    }
                    if (condition.getComparator() != null) {
                        int result = condition.getComparator().compare(value1, value2);
                        if (!condition.isAsc()) {
                            result = -result;
                        }
                        return result;
                    } else {
                        return compareTo(condition.isAsc(), value1, value2);
                    }
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                    return 0;
                }
            }

        };
    }

    /**
     * 获取支持多个条件进行排序的比较器
     * @param conditions 条件集,按list先后顺序进行排序
     * @return Comparator 支持多个条件排序的比较器
     */
    public static Comparator<Object> getComparator(List<SortCondition> conditions) {
        final List<Comparator<Object>> comparatorList = new ArrayList<Comparator<Object>>();
        for (SortCondition sortCondition : conditions) {
            comparatorList.add(getComparator(sortCondition));
        }
        return getComparatorByComparatorList(comparatorList);
    }

    /**
     * 获取支持多个条件进行排序的比较器
     * @param comparatorList 排序比较器列表,按list先后顺序进行排序
     * @return Comparator 支持多个条件排序的比较器
     */
    public static Comparator<Object> getComparatorByComparatorList(final List<Comparator<Object>> comparatorList) {
        return new Comparator<Object>() {

            public int compare(Object o1, Object o2) {
                for (Comparator<Object> c : comparatorList) {
                    int result = c.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }
        };
    }

    /**
     * 比较两个对象的排列次序
     * @param isAsc
     * @param object1
     * @param object2
     * @return
     */
    public static int compareTo(boolean isAsc, Object object1, Object object2) {
        int result = 0;
        try {
            result = compareTo(object1, object2);
            if (!isAsc) {
                result = -result;
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    /**
     * 比较两个对象的排列次序
     * @param object1
     * @param object2
     * @return
     */
    public static int compareTo(Object object1, Object object2) {
        boolean isEmptyV1 = AssertUtil.isEmpty(object1);
        boolean isEmptyV2 = AssertUtil.isEmpty(object2);
        if (!isEmptyV1 && !isEmptyV2) {
            String value1 = object1.toString();
            String value2 = object2.toString();
            if (object1 instanceof Date) {
                return ((Date) object1).compareTo((Date) object2);
            } else if (object1 instanceof Number || (isNumeric(value1) && isNumeric(value2))) {
                try {
                    return new BigDecimal(value1).compareTo(new BigDecimal(value2));
                } catch (Exception e) {
                    return value1.compareTo(value2);
                }
            } else {
                return value1.compareTo(value2);
            }
        } else if (!isEmptyV1 && isEmptyV2) {
            return 1;
        } else if (isEmptyV1 && !isEmptyV2) {
            return -1;
        } else {
            return 0;
        }
    }

    /**
     * 判断字符串的内容是不是全是数字
     * @param str
     * @return
     */
    public static boolean isNumeric(String str) {
        if (str == null) {
            return false;
        }
        int sz = str.length();
        for (int i = 0; i < sz; i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

}



测试类,方法不全,后期有空补上

package cn.elwy.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import cn.elwy.common.Person;
import cn.elwy.common.util.sort.SortCondition;
import cn.elwy.common.util.sort.SortUtil;

/**
 * 利用反射机制进行排序测试类
 * @author huangsq
 * @version 1.0, 2014-07-25
 * @since 1.0, 2014-07-25
 */
public class SortUtilTest {

    private List<Person> list;
    private boolean isPrintResult = false;

    @Before
    public void initList() throws ParseException {
        int n = 100;
        list = new ArrayList<Person>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        for (int i = 0; i < n; i++) {
            int mod5 = i % 5;
            boolean isStatus = mod5 == 1;
            list.add(new Person(i, "张三", 19 + mod5, true, 20 - mod5, 1.5 * mod5, sdf.parse("1986-02-19"),
                    "2012-2-31 18:01:50"));
            list.add(new Person(i, "张三2", 19 + mod5, true, 20 - mod5, 2.0 * mod5, sdf.parse("1986-02-19"),
                    "2012-2-31 18:01:50"));
            list.add(new Person(i + mod5, "张三2", 19 + mod5, true, 20 - mod5, 2.0 * mod5, sdf.parse("1986-02-19"),
                    "2012-2-31 18:01:50"));
            list.add(new Person(i, "张三2", 19 + mod5, true, 20 - mod5, 1.0 * mod5, sdf.parse("1986-02-19"),
                    "2012-1-31 18:01:50"));
            list.add(new Person(i, "张三3", 26 + mod5, true, 30 - mod5, 3.0 * mod5, sdf.parse("1986-01-19"),
                    "2012-1-31 18:01:50"));
            list.add(new Person(i, "张三2", 19 + mod5, true, 50 - mod5, 2.0 * mod5, sdf.parse("1986-03-19"),
                    "2012-1-31 18:01:50"));

            list.add(new Person(i + 1, "李四", 19 + mod5, true, 6 - mod5, null, sdf.parse("1986-3-28"),
                    "2013-11-10 18:10:30"));
            list.add(new Person(i + 2, "王五", 25 - mod5, isStatus, 3, 6.0 + mod5, sdf.parse("1986-01-31"),
                    "2012-1-31 20:01:50"));
            list.add(new Person(i + 2, "王五2", 25 - mod5, isStatus, 3, 6.0 + mod5, sdf.parse("1986-05-19"),
                    "2012-5-31 20:01:50"));
            list.add(new Person(i + 3, "赵六", 26 + mod5, !isStatus, 6 - mod5, 6.5 - mod5, sdf.parse("1986-02-19"),
                    "2012-2-31 20:11:50"));
        }

    }

    @Test
    public void testSortByByString() {
        List<String> list1 = new ArrayList<String>();
        list1.add("2231231");
        list1.add("8");
        list1.add("1123");
        list1.add("g");
        list1.add("9adfsad");
        list1.add("9a2312dfsad");
        list1.add("911adfsad");
        list1.add("一");
        list1.add("3");
        list1.add("g");
        list1.add("3");
        list1.add("3");
        list1.add("a");
        System.out.println("testListByString=================");
        long startTime = System.currentTimeMillis();
        SortUtil.sort(list1, true);
        System.out.println(System.currentTimeMillis() - startTime);
        System.out.println("testListByString=================");
        if (!isPrintResult) {
            return;
        }
        for (int i = 0; i < list1.size(); i++) {
            System.out.print(list1.get(i) + " ,");
        }
    }

    @Test
    public void testSortByMethod() throws ParseException {
        // Integer id, String name, int age, boolean isStatus, long salary, Double salary1, Date birthday
        System.out.println("testSortByMethod=====getRegTime============");
        long startTime = System.currentTimeMillis();
        SortUtil.sort(list, true, "regTime");
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortByMethod======getRegTime===========");
    }

    @Test
    public void testSortByMethods() throws ParseException {
        // Integer id, String name, int age, boolean isStatus, long salary, Double salary1, Date birthday
        System.out.println("testSortByMethods===getRegTime, getBirthday, getAge, getSalary1, getId==============");
        long startTime = System.currentTimeMillis();
        String[] methodNames = new String[] { "regTime", "birthday", "age", "salary1", "id" };
        SortUtil.sort(list, new boolean[] { true }, methodNames);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortByMethods====getRegTime, getBirthday, getAge, getSalary1, getId=============");
    }

    @Test
    public void testSortUtilByCondition() throws ParseException {
        // Integer id, String name, int age, boolean isStatus, long salary, Double salary1, Date birthday
        System.out.println("testSortUtilByCondition===========name======");

        SortCondition condition = new SortCondition(false, "name");
        condition.setSupportMap(true);

        long startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition========name=========");

        System.out.println("testSortUtilByCondition=====getRegTime============");
        condition = new SortCondition(true, "getRegTime()");
        condition.setFormat(new SimpleDateFormat("yyyy-MM-dd"));

        startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition=========getRegTime========");
        System.out.println("testSortUtilByCondition=======getAge==========");

        condition = new SortCondition(false, "getAge()");

        startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition==========getAge=======");

        System.out.println("testSortUtilByCondition======birthday==========");

        condition = new SortCondition(true, "birthday");

        startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition============birthday=====");

        System.out.println("testSortUtilByCondition=======salary1==========");

        condition = new SortCondition(true, "salary1");

        startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition========salary1=========");

        System.out.println("testSortUtilByCondition==========id=======");

        condition = new SortCondition(true, "id");

        startTime = System.currentTimeMillis();
        SortUtil.sort(list, condition);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByCondition==========id=======");

    }

    @Test
    public void testSortUtilByConditions() throws ParseException {
        // Integer id, String name, int age, boolean isStatus, long salary, Double salary1, Date birthday
        System.out.println("testSortUtilByConditions====getRegTime(), getAge(), name, birthday, salary1, id===");
        List<SortCondition> conditions = new ArrayList<SortCondition>();
        SortCondition e1 = new SortCondition(true, "getRegTime()");
        e1.setFormat(new SimpleDateFormat("yyyy-MM-dd"));
        conditions.add(e1);

        conditions.add(new SortCondition(false, "getAge()"));

        SortCondition e = new SortCondition(false, "name");
        e.setSupportMap(true);
        conditions.add(e);

        conditions.add(new SortCondition(true, "birthday"));
        conditions.add(new SortCondition(true, "salary1"));
        conditions.add(new SortCondition(true, "id"));

        long startTime = System.currentTimeMillis();
        SortUtil.sort(list, conditions);
        System.out.println(System.currentTimeMillis() - startTime);

        print(list);
        System.out.println("testSortUtilByConditions====getRegTime(), getAge(), name, birthday, salary1, id===");
    }

    @Test
    public void testSortByArray() throws ParseException {
        Person[] arrays = list.toArray(new Person[] {});
        // Integer id, String name, int age, boolean isStatus, long salary, Double salary1, Date birthday
        System.out.println("testSortByArray======regTime, birthday, age, salary1, id===========");
        long startTime = System.currentTimeMillis();
        String[] methodNames = new String[] { "regTime", "birthday", "age", "salary1", "id" };
        SortUtil.sort(arrays, new boolean[] { false, false, true }, methodNames);

        System.out.println(System.currentTimeMillis() - startTime);
        print(arrays);
        System.out.println("testSortByArray======regTime, birthday, age, salary1, id===========");

    }

    private void print(List<Person> list) {
        if (!isPrintResult) {
            return;
        }
        for (Person person : list) {
            System.out.println(person);
        }
    }

    private void print(Person[] arrays) {
        if (!isPrintResult) {
            return;
        }
        for (Person person : arrays) {
            System.out.println(person);
        }
    }

}