Java对List对象进行排序

有时候需要对List对象进行排序,如果每一处都去写一个排序方法,就会产生重复代码的坏味道,而且每一处都写,工作量会很大。
我们知道,Java提供了一个Collections.sort()方法可以对List排序,利用Java反射机制,很容易就能写出一个通用的排序方法。

为了防止出现不按照getter,setter规范命名的POJO类,我不打算动态调用getXXX()方法,而是直接获取对象的属性值。为了达到不论是否是public成员变量,都能获取到的目的,在获取到Field后,调用了setAccessible(true); 来设置访问权限。
具体代码如下:

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. /** 
  2.      * 对List对象按照某个成员变量进行排序 
  3.      * @param list       List对象 
  4.      * @param sortField  排序的属性名称 
  5.      * @param sortMode   排序方式:ASC,DESC 任选其一 
  6.      */  
  7.     public static <T> void sortList(List<T> list, final String sortField, final String sortMode) {  
  8.         Collections.sort(list, new Comparator<T>() {  
  9.             @Override  
  10.             public int compare(T o1, T o2) {  
  11.                 try {  
  12.                     Class clazz = o1.getClass();  
  13.                     Field field = clazz.getDeclaredField(sortField); //获取成员变量  
  14.                     field.setAccessible(true); //设置成可访问状态  
  15.                     String typeName = field.getType().getName().toLowerCase(); //转换成小写  
  16.   
  17.                     Object v1 = field.get(o1); //获取field的值  
  18.                     Object v2 = field.get(o2); //获取field的值  
  19.   
  20.                     boolean ASC_order = (sortMode == null || "ASC".equalsIgnoreCase(sortMode));  
  21.   
  22.                     //判断字段数据类型,并比较大小  
  23.                     if(typeName.endsWith("string")) {  
  24.                         String value1 = v1.toString();  
  25.                         String value2 = v2.toString();  
  26.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  27.                     }  
  28.                     else if(typeName.endsWith("short")) {  
  29.                         Short value1 = Short.parseShort(v1.toString());  
  30.                         Short value2 = Short.parseShort(v2.toString());  
  31.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  32.                     }  
  33.                     else if(typeName.endsWith("byte")) {  
  34.                         Byte value1 = Byte.parseByte(v1.toString());  
  35.                         Byte value2 = Byte.parseByte(v2.toString());  
  36.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  37.                     }  
  38.                     else if(typeName.endsWith("char")) {  
  39.                         Integer value1 = (int)(v1.toString().charAt(0));  
  40.                         Integer value2 = (int)(v2.toString().charAt(0));  
  41.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  42.                     }  
  43.                     else if(typeName.endsWith("int") || typeName.endsWith("integer")) {  
  44.                         Integer value1 = Integer.parseInt(v1.toString());  
  45.                         Integer value2 = Integer.parseInt(v2.toString());  
  46.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  47.                     }  
  48.                     else if(typeName.endsWith("long")) {  
  49.                         Long value1 = Long.parseLong(v1.toString());  
  50.                         Long value2 = Long.parseLong(v2.toString());  
  51.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  52.                     }  
  53.                     else if(typeName.endsWith("float")) {  
  54.                         Float value1 = Float.parseFloat(v1.toString());  
  55.                         Float value2 = Float.parseFloat(v2.toString());  
  56.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  57.                     }  
  58.                     else if(typeName.endsWith("double")) {  
  59.                         Double value1 = Double.parseDouble(v1.toString());  
  60.                         Double value2 = Double.parseDouble(v2.toString());  
  61.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  62.                     }  
  63.                     else if(typeName.endsWith("boolean")) {  
  64.                         Boolean value1 = Boolean.parseBoolean(v1.toString());  
  65.                         Boolean value2 = Boolean.parseBoolean(v2.toString());  
  66.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  67.                     }  
  68.                     else if(typeName.endsWith("date")) {  
  69.                         Date value1 = (Date)(v1);  
  70.                         Date value2 = (Date)(v2);  
  71.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  72.                     }  
  73.                     else if(typeName.endsWith("timestamp")) {  
  74.                         Timestamp value1 = (Timestamp)(v1);  
  75.                         Timestamp value2 = (Timestamp)(v2);  
  76.                         return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);  
  77.                     }  
  78.                     else {  
  79.                         //调用对象的compareTo()方法比较大小  
  80.                         Method method = field.getType().getDeclaredMethod("compareTo"new Class[]{field.getType()});  
  81.                         method.setAccessible(true); //设置可访问权限  
  82.                         int result  = (Integer)method.invoke(v1, new Object[]{v2});  
  83.                         return ASC_order ? result : result*(-1);  
  84.                     }  
  85.                 }  
  86.                 catch (Exception e) {  
  87.                     String err = e.getLocalizedMessage();  
  88.                     System.out.println(err);  
  89.                     e.printStackTrace();  
  90.                 }  
  91.   
  92.                 return 0//未知类型,无法比较大小  
  93.             }  
  94.         });  
  95.     }  

后续有很多开发填坑的文章发布,如果对你有帮助,请支持和加关注一下

http://e22a.com/h.05ApkG?cv=AAKHZXVo&sm=339944

https://shop119727980.taobao.com/?spm=0.0.0.0 

 

转载于:https://my.oschina.net/baishi/blog/367699

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值