List<T> 属性排序

来源:互联网 发布:js判断display none 编辑:程序博客网 时间:2024/06/06 02:58

0.背景

由于需要,按照不同字段对List中对象进行排序,就学习了下反射和JDK中相关接口就写了个排序工具类。目前支持对象属性排序:字符串类型,Integer、Long基本类型的排序。如果需要其它类型比较可以根据自己需求进行扩展。

1

public class ListSortUtil {    private static Object getValue(Object ob, final String strField) {        try {            Field field = ob.getClass().getDeclaredField(strField);            field.setAccessible(true);            return field.get(ob);        } catch (Exception ex) {            System.out.print(ex.getMessage());        }        return null;    }    /**     * field 是要排序的字段     * 默认是升序,只能比较字符串和Integer和Long     */    public static <T> void sort(List<T> src, final String field, final OrderType orderType) {        Collections.sort(src, new Comparator<T>() {            @Override            public int compare(T o1, T o2) {                Object value1 = getValue(o1, field);                Object value2 = getValue(o2, field);                if (value1 == null || value2 == null) {                    throw new RuntimeException("field字段为空");                }                int value = 0;                if (value1 instanceof String || value2 instanceof String) {                    value = String.valueOf(value1).compareTo(String.valueOf(value2));                } else if ((value1 instanceof Integer || value1 instanceof Long) &&                        (value2 instanceof Integer || value2 instanceof Long)) {                    value = Long.valueOf(value1.toString()).compareTo(Long.valueOf(value2.toString()));                }                if (OrderType.DESC.equals(orderType)) {                    return -value;                }                return value;            }        });    }}

升序或者降序的枚举类

public enum OrderType {    DESC(1, "降序"),    ASC(2, "升序");    /**     * 类型值     */    private Integer value;    /**     * 描述     */    private String desc;    private OrderType(Integer value, String desc) {        this.value = value;        this.desc = desc;    }    public Integer getValue() {        return value;    }    public String getDesc() {        return desc;    }}

bean对象

public class Student {    private String name;    private Integer age;    public Student(String name, Integer age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

测试程序

public class TestMain {    public static void main(String[] args) {        List<Student> students=new ArrayList();        students.add(new Student("abc",15));        students.add(new Student("bac",19));        students.add(new Student("aac",18));        System.out.println("--按照age降序---");        ListSortUtil.sort(students,"age",OrderType.DESC);        print(students);        System.out.println("--按照name升序---");        ListSortUtil.sort(students,"name",OrderType.ASC);        print(students);    }    public static void print(List<Student> students)    {        for(Student student:students)        {            System.out.println(student.toString());        }    }}

输出:

--按照age降序---Student{name='bac', age=19}Student{name='aac', age=18}Student{name='abc', age=15}--按照name升序---Student{name='aac', age=18}Student{name='abc', age=15}Student{name='bac', age=19}
0 0
原创粉丝点击