Java List 通用排序工具类

场景: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("运行结束!");
    }


}


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java的集合类是一组用于管理和操作对象集合的类和接口。集合类的主要目的是提供一组常用的数据结构和算法,以便程序员可以更方便地处理数据。 Java的集合类主要分为两种:基于接口的集合类和基于实现的集合类。 1. 基于接口的集合类:这些集合类都是基于Java集合框架中提供的接口来实现的。这些接口包括List、Set、Queue和Map等。这些接口提供了通用的集合操作,如添加元素、删除元素、搜索元素等。 2. 基于实现的集合类:这些集合类是基于Java集合框架中提供的接口的实现来实现的。例如,ArrayListList接口的一个实现,HashSet是Set接口的一个实现。 Java的集合类包括以下常用类和接口: 1. List接口:List是一个有序的集合,允许重复的元素。常用的List实现类包括ArrayList、LinkedList和Vector等。 2. Set接口:Set是一个无序的集合,不允许重复的元素。常用的Set实现类包括HashSet、TreeSet和LinkedHashSet等。 3. Map接口:Map是一个键值对的集合,每个键对应一个值。常用的Map实现类包括HashMap、TreeMap和LinkedHashMap等。 4. Queue接口:Queue是一个队列,用于存储元素,可以实现先进先出的操作。常用的Queue实现类包括LinkedList和PriorityQueue等。 5. Stack类:Stack是一个栈,用于存储元素,可以实现后进先出的操作。 6. Collections类:Collections是一个包含许多静态方法的工具类,用于操作集合。包括排序、查找、替换、反转等常用操作。 总之,Java的集合类提供了丰富的数据结构和算法,使得程序员可以更加方便地进行数据操作和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值