首页 > 学院 > 开发设计 > 正文

List<T> 属性排序

2019-11-06 08:22:25
字体:
来源:转载
供稿:网友

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}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表