Java List 通用排序工具类

来源:互联网 发布:计算机的发展史软件 编辑:程序博客网 时间:2024/06/07 10:13

场景:Java 类 需 重新排序,有时升序、有时倒序,有时是按照多字段排序

功能描述:

1.支持 对象的一个属性或多个属性进行排序.
2.支持 对象属性正序和倒序排列.

3.支持 数字字符类型的List排序

4.泛型实现,结合Comparable接口, 支持多类型数据格式 

代码:

package GenericTest;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Collections;import java.util.Comparator;import java.util.Date;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * [简述]:List通用排序工具类 * User: xyj * Date:2016/7/2 * Time:10:24 * To change this template use File | Settings | File Templates. */public class ListSortUtil {    private static final String SORT_ASC = "asc";    private static final String SORT_DESC = "desc";    /**     * [简述]: 对List数组排序     * @param list 源数据 排序集合     * @param sort 升序 还是 降序,默认升序     * @return List     */    public static List<?> sort(List<?> list,final String sort){        Collections.sort(list, new Comparator<Object>() {            @Override            public int compare(Object o1, Object o2) {                int ret = 0;                if(o1 instanceof Integer){                    ret = ((Integer)o1).compareTo((Integer)o2);                } else if(o1 instanceof Double){                    ret = ((Double)o1).compareTo((Double)o2);                } else if(o1 instanceof Long){                    ret = ((Long)o1).compareTo((Long)o2);                } else if(o1 instanceof Float){                    ret = ((Float)o1).compareTo((Float)o2);                } else if(o1 instanceof Date){                    ret = ((Date)o1).compareTo((Date) o2);                } else if(isDouble(String.valueOf(o1)) && isDouble(String.valueOf(o2))){                    ret = (new Double(o1.toString())).compareTo(new Double(o2.toString()));                } else {                    ret = String.valueOf(o1).compareTo(String.valueOf(o2));                }                if(null != sort && SORT_DESC.equalsIgnoreCase(sort)){                    return -ret;                }else{                    return ret;                }            }        });        return list;    }    /**     *[简述]: List 泛型 排序     * @param list 源数据 排序集合     * @param field 排序的数据字段名称     * @param sort 升序 还是 降序,默认升序     * @param <T> 泛型T     * @return List     */    public static <T> List<T> sort(List<T> list,final String field,final String sort){        Collections.sort(list, new Comparator<T>() {            @Override            public int compare(T o1, T o2) {                int ret = 0;                try {                    Method method1 = o1.getClass().getDeclaredMethod(getMethodName(field),null);                    Method method2 = o2.getClass().getDeclaredMethod(getMethodName(field), null);                    Field field1 = o1.getClass().getDeclaredField(field);                    field1.setAccessible(true);                    Class<?> type = field1.getType();                    if(type == int.class){                        ret = ((Integer)field1.getInt(o1)).compareTo((Integer)field1.getInt(o2));                    } else if(type == double.class){                        ret = ((Double)field1.getDouble(o1)).compareTo((Double)field1.getDouble(o2));                    } else if(type == long.class){                        ret = ((Long)field1.getLong(o1)).compareTo((Long)field1.getLong(o2));                    } else if(type == float.class){                        ret = ((Float)field1.getFloat(o1)).compareTo((Float)field1.getFloat(o2));                    } else if(type == Date.class){                        ret = ((Date)field1.get(o1)).compareTo((Date) field1.get(o2));                    } else if(isDouble(String.valueOf(field1.get(o1))) && isDouble(String.valueOf(field1.get(o2)))){                        ret = (new Double(method1.invoke(o1).toString())).compareTo(new Double(method2.invoke(o2).toString()));                    } else {                        ret = String.valueOf(field1.get(o1)).compareTo(String.valueOf(field1.get(o2)));                    }                } catch (IllegalAccessException e) {                    e.printStackTrace();                } catch (NoSuchFieldException e) {                    e.printStackTrace();                } catch (NoSuchMethodException e) {                    e.printStackTrace();                } catch (InvocationTargetException e) {                    e.printStackTrace();                }                if(null != sort && SORT_DESC.equalsIgnoreCase(sort)){                    return  -ret;                }else{                    return ret;                }            }        });        return list;    }    private static boolean isDouble(String str){        boolean flag = false;        if(isInteger(str) || isFloat(str)){            flag = true;        }        return flag;    }    private static boolean isInteger(String str){        Matcher matcher = Pattern.compile("^[+-]?[0-9]+$").matcher(str);        return matcher.find();    }    private static boolean isFloat(String str){        return str.matches("[\\d]+\\.[\\d]+");    }    /**     *[简述]: List 泛型 排序     * @param list 源数据 排序集合     * @param fields 排序的数据字段名称     * @param sorts 升序 还是 降序     * @param <T> 泛型T     * @return List     */    public static <T> List<T> sort(List<T> list,final String [] fields,final String [] sorts){        if(null != fields && fields.length > 0){            for(int index = 0;index < fields.length;index ++){                String sortRule = SORT_ASC;                if(null != sorts && sorts.length >= index && null != sorts[index]){                    sortRule = sorts[index];                }                final String sort = sortRule;                final String field = fields[index];                Collections.sort(list, new Comparator<T>() {                    @Override                    public int compare(T o1, T o2) {                        int ret = 0;                        try {                            Method method1 = o1.getClass().getDeclaredMethod(getMethodName(field),null);                            Method method2 = o1.getClass().getDeclaredMethod(getMethodName(field), null);                            Field field1 = o1.getClass().getDeclaredField(field);                            field1.setAccessible(true);                            Class<?> type = field1.getType();                            if(type == int.class){                                ret = ((Integer)field1.getInt(o1)).compareTo((Integer)field1.getInt(o2));                            } else if(type == double.class){                                ret = ((Double)field1.getDouble(o1)).compareTo((Double)field1.getDouble(o2));                            } else if(type == long.class){                                ret = ((Long)field1.getLong(o1)).compareTo((Long)field1.getLong(o2));                            } else if(type == float.class){                                ret = ((Float)field1.getFloat(o1)).compareTo((Float)field1.getFloat(o2));                            } else if(type == Date.class){                                ret = ((Date)field1.get(o1)).compareTo((Date) field1.get(o2));                            } else if(isDouble(String.valueOf(field1.get(o1))) && isDouble(String.valueOf(field1.get(o2)))){                                ret = (new Double(method1.invoke(o1).toString())).compareTo(new Double(method2.invoke(o2).toString()));                            } else {                                ret = String.valueOf(field1.get(o1)).compareTo(String.valueOf(field1.get(o2)));                            }                        } catch (NoSuchMethodException e) {                            e.printStackTrace();                        } catch (InvocationTargetException e) {                            e.printStackTrace();                        } catch (IllegalAccessException e) {                            e.printStackTrace();                        } catch (NoSuchFieldException e) {                            e.printStackTrace();                        }                        if(null != sort && SORT_DESC.equalsIgnoreCase(sort)){                            return  -ret;                        }else{                            return ret;                        }                    }                });            }        }        return list;    }    private static String getMethodName(String str){        StringBuffer name = new StringBuffer();        name = name.append("get").append(firstLetterToCapture(str));        return name.toString();    }    private static String firstLetterToCapture(String name){        char[] arr = name.toCharArray();        arr[0] -= 32;        return String.valueOf(arr);    }}

测试类:

package utils.ListSortTest;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;import org.testng.annotations.Test;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * Created by with IntelliJ IDEA. * User:xyj * Date:2016/7/11 * Time:17:21 * To change this template use File | Settings | File Templates. */@ContextConfiguration("classpath:spring/applicationContext.xml")public class TestListSort extends AbstractTestNGSpringContextTests{    @Test    public void testListSortNumberString(){        List<String> arrays = new ArrayList<String>();        arrays.add("2");        arrays.add("13");        arrays.add("4.5");        arrays.add("26");        List<String> afterSortArrays = (List<String>) ListSortUtil.sort(arrays, "asc");        for(String s:afterSortArrays){            System.out.println(String.valueOf(s));        }    }    @Test    public void testListSortString(){        List<String> arrays = new ArrayList<String>();        arrays.add("ac");        arrays.add("cd");        arrays.add("ab");        arrays.add("bf");        arrays.add("bfd");        arrays.add("bg");        arrays.add("ba");        List<String> afterSortArrays = (List<String>) ListSortUtil.sort(arrays, "asc");        for(String s:afterSortArrays){            System.out.println(String.valueOf(s));        }    }    @Test    public void testListSortNumber(){        List<Integer> arrays = new ArrayList<Integer>();        arrays.add(12);        arrays.add(56);        arrays.add(2);        arrays.add(-5);        arrays.add(21);        arrays.add(0);        List<Integer> afterSortArrays = (List<Integer>) ListSortUtil.sort(arrays, "asc");        for(Integer s:afterSortArrays){            System.out.println(String.valueOf(s));        }    }    @Test    public void testListSortDouble() {        List<Double> arrays = new ArrayList<Double>();        arrays.add(-0.12);        arrays.add(-0.102);        arrays.add(12.0);        arrays.add(0.0);        arrays.add(9.2);        arrays.add(-1.2);        arrays.add(-1.20001);        arrays.add(3.0);        arrays.add(31.0);        List<Double> afterSortArrays = (List<Double>) ListSortUtil.sort(arrays, "asc");        for(Double s:afterSortArrays){            System.out.println(String.valueOf(s));        }    }    @Test    public void testListSortDate(){        List<Date> arrays = new ArrayList<Date>();        arrays.add(DateUtil.parseDate("2015-01-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-11-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-12-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-02-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-06-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-10-12",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-10-31",DateUtil.DATE_FORMAT_EN));        arrays.add(DateUtil.parseDate("2015-10-02",DateUtil.DATE_FORMAT_EN));        List<Date> afterSortArrays = (List<Date>) ListSortUtil.sort(arrays, "asc");        for(Date s:afterSortArrays){            System.out.println(String.valueOf(DateUtil.date2Str(s,DateUtil.DATE_FORMAT_EN)));        }    }}

测试类 Two:

package utils.ListSortTest;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import java.util.ArrayList;import java.util.List;/** * Created by with IntelliJ IDEA. * User:xyj * Date:2016/7/11 * Time:14:48 * To change this template use File | Settings | File Templates. */@ContextConfiguration("classpath:spring/applicationContext.xml")public class TestListSortUtils extends AbstractTestNGSpringContextTests{    private static final Logger logger = LoggerFactory.getLogger(TestListSortUtils.class);    List<SysUser> sysUsers = new ArrayList<SysUser>();    private List<SysUser> getUsers(){        List<SysUser> sysUsers = new ArrayList<SysUser>();        SysUser sysUser3 = new SysUser();        sysUser3.setPkid("12");        sysUser3.setLoginName("naver");        sysUser3.setPassword("4");        sysUser3.setContact("15153");        sysUser3.setEnabled(2);        sysUsers.add(sysUser3);        SysUser sysUser2 = new SysUser();        sysUser2.setPkid("3");        sysUser2.setLoginName("Tex");        sysUser2.setPassword("3");        sysUser2.setContact("415151");        sysUser2.setEnabled(2);        sysUsers.add(sysUser2);        SysUser sysUser0 = new SysUser();        sysUser0.setPkid("1");        sysUser0.setLoginName("tommy");        sysUser0.setPassword("1");        sysUser0.setContact("123456");        sysUser0.setEnabled(1);        sysUsers.add(sysUser0);        SysUser sysUser1 = new SysUser();        sysUser1.setPkid("2");        sysUser1.setLoginName("tony");        sysUser1.setPassword("2");        sysUser1.setContact("5621232");        sysUser1.setEnabled(1);        sysUsers.add(sysUser1);        return sysUsers;    }    @BeforeClass    public void setInitBeforeSortList(){        sysUsers = getUsers();        logger.info("before sort :");        for(SysUser sysUser:sysUsers){            logger.info("sysUser: pkid: [ " + sysUser.getPkid() + " ]"                    + " userCode: [ "+ sysUser.getLoginName() + " ]"                    + " contact: [ "+ sysUser.getContact() + " ]"            );        }    }    @Test    public void testListSort(){        List<SysUser> afterSysUsers  = ListSortUtil.sort(sysUsers,"loginName",null);        logger.info("after sort :");        for(SysUser sysUser:afterSysUsers){            logger.info("sysUser: pkid: [ " + sysUser.getPkid() + " ]"                    + " userCode: [ "+ sysUser.getLoginName() + " ]"                     + " contact: [ "+ sysUser.getContact() + " ]"            );        }    }    @AfterClass    public void destroy(){        logger.info("运行结束!");    }}
测试 Three:

package utils.ListSortTest;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import java.util.ArrayList;import java.util.List;/** * Created by with IntelliJ IDEA. * User:xyj * Date:2016/7/11 * Time:14:48 * To change this template use File | Settings | File Templates. */@ContextConfiguration("classpath:spring/applicationContext.xml")public class TestListSortOrderUtils extends AbstractTestNGSpringContextTests{    private static final Logger logger = LoggerFactory.getLogger(TestListSortOrderUtils.class);    List<SysUser> sysUsers = new ArrayList<SysUser>();    private List<SysUser> getUsers(){        List<SysUser> sysUsers = new ArrayList<SysUser>();        SysUser sysUser3 = new SysUser();        sysUser3.setPkid("12");        sysUser3.setLoginName("naver");        sysUser3.setPassword("4");        sysUser3.setContact("15153");        sysUser3.setEnabled(2);        sysUsers.add(sysUser3);        SysUser sysUser2 = new SysUser();        sysUser2.setPkid("3");        sysUser2.setLoginName("Tex");        sysUser2.setPassword("3");        sysUser2.setContact("415151");        sysUser2.setEnabled(2);        sysUsers.add(sysUser2);        SysUser sysUser0 = new SysUser();        sysUser0.setPkid("1");        sysUser0.setLoginName("tommy");        sysUser0.setPassword("1");        sysUser0.setContact("123456");        sysUser0.setEnabled(1);        sysUsers.add(sysUser0);        SysUser sysUser1 = new SysUser();        sysUser1.setPkid("2");        sysUser1.setLoginName("tony");        sysUser1.setPassword("2");        sysUser1.setContact("5621232");        sysUser1.setEnabled(1);        sysUsers.add(sysUser1);        return sysUsers;    }    @BeforeClass    public void setInitBeforeSortList(){        sysUsers = getUsers();        logger.info("before sort :");        for(SysUser sysUser:sysUsers){            logger.info("sysUser: pkid: [ " + sysUser.getPkid() + " ]"                    + " userCode: [ "+ sysUser.getLoginName() + " ]"                    + " contact: [ "+ sysUser.getContact() + " ]"            );        }    }    @Test    public void testListSort(){        List<SysUser> afterSysUsers  = ListSortUtil.sort(sysUsers,new String[] {"pkid","contact"},new String[] {"asc","desc"});        logger.info("after sort :");        for(SysUser sysUser:afterSysUsers){            logger.info("sysUser: pkid: [ " + sysUser.getPkid() + " ]"                    + " userCode: [ "+ sysUser.getLoginName() + " ]"                     + " contact: [ "+ sysUser.getContact() + " ]"            );        }    }    @AfterClass    public void destroy(){        logger.info("运行结束!");    }}


0 0
原创粉丝点击