Java對List對象進行排序

有時候須要對List對象進行排序,若是每一處都去寫一個排序方法,就會產生重複代碼的壞味道,並且每一處都寫,工做量會很大。
咱們知道,Java提供了一個Collections.sort()方法能夠對List排序,利用Java反射機制,很容易就能寫出一個通用的排序方法。

爲了防止出現不按照getter,setter規範命名的POJO類,我不打算動態調用getXXX()方法,而是直接獲取對象的屬性值。爲了達到不管是否是public成員變量,都能獲取到的目的,在獲取到Field後,調用了setAccessible(true); 來設置訪問權限。
具體代碼以下:java

 

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片ide

  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.     }  

後續有不少開發填坑的文章發佈,若是對你有幫助,請支持和加關注一下spa

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

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

相關文章
相關標籤/搜索