当前位置:编程学习 > JAVA >>

Java通用工具类之按对象属性排序工具

本工具类为按对象属性排序工具类,实现的功能:
1.按对象的一个属性和多个属性进行排序.
2.按对象属性正序和倒序排列.
3.完美支持int等基础类和Integer等包装类.
4.完美支持属性为实现了Comparable接口的类.
5.如果类不是java.lang中定义的基础类型也没有实现Comparable接口则转为String后进行排序.
 
实现思路:使用反射取得对象属性或对象方法的值从而解除对具体对象的依赖.
 
import java.lang.reflect.Field;  
import java.lang.reflect.InvocationTargetException;  
import java.lang.reflect.Method;  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.Date;  
import java.util.List;  
  
/** 
 * 通用工具类之按对象中某属性排序 
 * @author 李坤  
 * 交流博客:http://blog.csdn.net/lk_blog 
 */  
public class SortListUtil {  
    public static final String DESC = "desc";  
    public static final String ASC = "asc";  
  
    /** 
     * 对list中的元素按升序排列. 
     *  
     * @param list 
     *            排序集合 
     * @param field 
     *            排序字段 
     * @return 
     */  
    public static List<?> sort(List<?> list, final String field) {  
        return sort(list, field, null);  
    }  
  
    /** 
     * 对list中的元素进行排序. 
     *  
     * @param list 
     *            排序集合 
     * @param field 
     *            排序字段 
     * @param sort 
     *            排序方式: SortList.DESC(降序) SortList.ASC(升序). 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static List<?> sort(List<?> list, final String field,  
            final String sort) {  
        Collections.sort(list, new Comparator() {  
            public int compare(Object a, Object b) {  
                int ret = 0;  
                try {  
                    Field f = a.getClass().getDeclaredField(field);  
                    f.setAccessible(true);  
                    Class<?> type = f.getType();  
  
                    if (type == int.class) {  
                        ret = ((Integer) f.getInt(a)).compareTo((Integer) f  
                                .getInt(b));  
                    } else if (type == double.class) {  
                        ret = ((Double) f.getDouble(a)).compareTo((Double) f  
                                .getDouble(b));  
                    } else if (type == long.class) {  
                        ret = ((Long) f.getLong(a)).compareTo((Long) f  
                                .getLong(b));  
                    } else if (type == float.class) {  
                        ret = ((Float) f.getFloat(a)).compareTo((Float) f  
                                .getFloat(b));  
                    } else if (type == Date.class) {  
                        ret = ((Date) f.get(a)).compareTo((Date) f.get(b));  
                    } else if (isImplementsOf(type, Comparable.class)) {  
                        ret = ((Comparable) f.get(a)).compareTo((Comparable) f  
                                .get(b));  
                    } else {  
                        ret = String.valueOf(f.get(a)).compareTo(  
                                String.valueOf(f.get(b)));  
                    }  
  
                } catch (SecurityException e) {  
                    e.printStackTrace();  
                } catch (NoSuchFieldException e) {  
                    e.printStackTrace();  
                } catch (IllegalArgumentException e) {  
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    e.printStackTrace();  
                }  
                if (sort != null && sort.toLowerCase().equals(DESC)) {  
                    return -ret;  
                } else {  
                    return ret;  
                }  
  
            }  
        });  
        return list;  
    }  
  
    /** 
     * 对list中的元素按fields和sorts进行排序, 
     * fields[i]指定排序字段,sorts[i]指定排序方式.如果sorts[i]为空则默认按升序排列. 
     *  
     * @param list 
     * @param fields 
     * @param sorts 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static List<?> sort(List<?> list, String[] fields, String[] sorts) {  
        if (fields != null && fields.length > 0) {  
            for (int i = fields.length - 1; i >= 0; i--) {  
                final String field = fields[i];  
                String tmpSort = ASC;  
                if (sorts != null && sorts.length > i && sorts[i] != null) {  
                    tmpSort = sorts[i];  
                }  
                final String sort = tmpSort;  
                Collections.sort(list, new Comparator() {  
                    public int compare(Object a, Object b) {  
                        int ret = 0;  
                        try {  
                            Field f = a.getClass().getDeclaredField(field);  
                            f.setAccessible(true);  
                            Class<?> type = f.getType();  
                            if (type == int.class) {  
                                ret = ((Integer) f.getInt(a))  
                                        .compareTo((Integer) f.getInt(b));  
                            } else if (type == double.class) {  
                                ret = ((Double) f.getDouble(a))  
                                        .compareTo((Double) f.getDouble(b));  
                            } else if (type == long.class) {  
                                ret = ((Long) f.getLong(a)).compareTo((Long) f  
                                        .getLong(b));  
                            } else if (type == float.class) {  
                                ret = ((Float) f.getFloat(a))  
                                        .compareTo((Float) f.getFloat(b));  
                            } else if (type == Date.class) {  
                                ret = ((Date) f.get(a)).compareTo((Date) f  
                                        .get(b));  
                            } else if (isImplementsOf(type, Comparable.class)) {  
                                ret = ((Comparable) f.get(a))  
                                        .compareTo((Comparable) f.get(b));  
                            } else {  
                                ret = String.valueOf(f.get(a)).compareTo(  
                                        String.valueOf(f.get(b)));  
                            }  
  
                        } catch (SecurityException e) {  
                            e.printStackTrace();  
                        } catch (NoSuchFieldException e) {  
                            e.printStackTrace();  
                        } catch (IllegalArgumentException e) {  
                            e.printStackTrace();  
                        } catch (IllegalAccessException e) {  
                            e.printStackTrace();  
                        }  
  
                        if (sort != null && sort.toLowerCase().equals(DESC)) {  
                            return -ret;  
                        } else {  
                            return ret;  
                        }  
                    }  
                });  
            }  
        }  
        return list;  
    }  
  
    /** 
     * 默认按正序排列 
     *  
     * @param list 
     * @param method 
     * @return 
     */  
    public static List<?> sortByMethod(List<?> list, final String method) {  
        return sortByMethod(list, method, null);  
    }  
  
    @SuppressWarnings("unchecked")  
    public static List<?> sortByMethod(List<?> list, final String method,  
            final String sort) {  
        Collections.sort(list, new Comparator() {  
            public int compare(Object a, Object b) {  
                int ret = 0
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,