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
- Java List 通用排序工具类
- Java通用排序工具类
- List对象利用属性进行排序的通用工具类
- Java工具类-List 排序
- java中LIST集合排序通用方法
- java中List对象排序通用方法
- java中List对象排序通用方法
- java中List对象排序通用方法
- java中List对象排序通用方法
- java中List对象排序通用方法
- List排序通用方法
- List集合按照对象中某个属性排序通用工具类(按对象中某属性排序)
- java中List按照指定字段排序工具类
- java中List按照指定字段排序工具类
- Java中List根据指定字段排序工具类
- java中List按照指定字段排序工具类
- java中List按照指定字段排序工具类
- Java通用工具类之按对象属性排序工具类
- java运行时执行顺序
- java 多线程之Executors.newFixedThreadPool
- 事件处理机制之响应系统设置的事件(Configuration类)
- java中substring和indexof() 和lastindexof()
- 一款不错的html5网站模板案例代码下载,用于开发个人网站,兼容手机与PC
- Java List 通用排序工具类
- 排序
- 打印数组所有内容
- AJAX入门
- Java 文件读取
- Hadoop2.4.1 简单的用户手机流量统计的MapReduce程序(三)
- UIWebView与H5的交互
- 读取前几行
- 在github中托管项目