这两天写代码过程中遇到一个需求,需要按照某个字段排序List集合,自己实现了一半,发现网上有个更好的版本,就采用了这个,记录下来。
使用这个工具类要注意一个就是 如果你按照age 字段排序,那么age字段值不能为空,如果值为空会报异常,那么解决这个办法就是将空值的赋值。
1 import java.lang.reflect.Method; 2 3 import java.util.Collections; 4 import java.util.Comparator; 5 import java.util.List; 6 7 /** 8 * 9 * @ClassName: ListSortUtil 10 * @Description:TODO(list集合排序 按照字段 升序或降序) 11 * @author: yh 12 * @date: 2017年2月9日 下午4:05:36 13 * 注意:要排序的字段值不能为空 14 * @param <T> 15 */ 16 public class ListSortUtil<T> { 17 /** 18 * @param targetList 目标排序List 19 * @param sortField 排序字段(实体类属性名) 20 * @param sortMode 排序方式(asc or desc) 21 */ 22 @SuppressWarnings({ "unchecked", "rawtypes" }) 23 public void sort(List<T> targetList, final String sortField, final String sortMode) { 24 25 Collections.sort(targetList, new Comparator() { 26 public int compare(Object obj1, Object obj2) { 27 int retVal = 0; 28 try { 29 30 String newStr=sortField.substring(0, 1).toUpperCase()+sortField.replaceFirst("\\w",""); 31 String methodStr="get"+newStr; 32 33 Method method1 = ((T)obj1).getClass().getMethod(methodStr, null); 34 Method method2 = ((T)obj2).getClass().getMethod(methodStr, null); 35 if (sortMode != null && "desc".equals(sortMode)) { 36 retVal = method2.invoke(((T) obj2), null).toString().compareTo(method1.invoke(((T) obj1), null).toString()); // 倒序 37 } else { 38 retVal = method1.invoke(((T) obj1), null).toString().compareTo(method2.invoke(((T) obj2), null).toString()); // 正序 39 } 40 } catch (Exception e) { 41 throw new RuntimeException(); 42 } 43 return retVal; 44 } 45 }); 46 } 47 48 }
时间: 2024-10-27 07:29:57