package com.mandi.common; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.lang3.StringUtils; public class ListSortUtil<T> { @SuppressWarnings({ "unchecked", "rawtypes" }) public void sort(List<T> targetList, final String sortField, final String sortMode) { Collections.sort(targetList, new Comparator() { public int compare(Object obj1, Object obj2) { int retVal = 0; try { //首嗿¯è½¬å¤§å†™ String newStr=sortField.substring(0, 1).toUpperCase()+sortField.replaceFirst("\\w",""); String methodStr="get"+newStr; Method method1 = ((T)obj1).getClass().getMethod(methodStr, null); Method method2 = ((T)obj2).getClass().getMethod(methodStr, null); if (sortMode != null && "desc".equals(sortMode)) { if(method1.invoke(((T) obj2), null)==null||method2.invoke(((T) obj1), null)==null){ retVal=1; }else { retVal = method1.invoke(((T) obj2), null).toString().compareTo(method2.invoke(((T) obj1), null).toString()); // å€’åº } } else { if(method2.invoke(((T) obj2), null)==null||method1.invoke(((T) obj1), null)==null){ retVal=-1; }else { retVal = method2.invoke(((T) obj1), null).toString().compareTo(method1.invoke(((T) obj2), null).toString()); // æ£åº } } } catch (Exception e) { throw new RuntimeException(); } return retVal; } }); } @SuppressWarnings({ "unchecked", "rawtypes" }) public void sortFields(List<T> targetList, final List<String> sortFields) { Collections.sort(targetList, new Comparator() { public int compare(Object obj1, Object obj2) { int retVal = 0; try { for (int i=0;i<sortFields.size();i++) { String sortField=sortFields.get(i).split("-")[0]; String sortMode=sortFields.get(i).split("-")[1]; //首嗿¯è½¬å¤§å†™ String newStr=sortField.substring(0, 1).toUpperCase()+sortField.replaceFirst("\\w",""); String methodStr="get"+newStr; Method method1 = ((T)obj1).getClass().getMethod(methodStr, null); Method method2 = ((T)obj2).getClass().getMethod(methodStr, null); if(method1==null|| method2==null){ continue; } Type tp =method1.getGenericReturnType(); String tt=""; boolean sz=false; if(tp!=null){ tt=tp.toString(); if(!StringUtils.isEmpty(tt)){ if(tt.contains("int")||tt.contains("double")){ sz=true; } } } if (sortMode != null && "desc".equals(sortMode)) { if(method2.invoke(((T) obj2), null)==null){ retVal=0; continue; }else if(method1.invoke(((T) obj1), null)==null){ retVal=0; continue; }else { if(sz){ if(!method1.invoke(((T) obj2), null).toString().equals(method2.invoke(((T) obj1), null).toString())){ if(tt.contains("int")){ if(Integer.parseInt(method1.invoke(((T) obj2), null).toString())>Integer.parseInt(method2.invoke(((T) obj1), null).toString())){ retVal = 1; // å€’åº }else if(Integer.parseInt(method1.invoke(((T) obj2), null).toString())<Integer.parseInt(method2.invoke(((T) obj1), null).toString())){ retVal = -1; }else{ retVal = 0; // å€’åº continue; } break; }else if(tt.contains("double")){ if(Double.parseDouble((method1.invoke(((T) obj2), null).toString()))>Double.parseDouble(method2.invoke(((T) obj1), null).toString())){ retVal = 1; // å€’åº }else if(Double.parseDouble(method1.invoke(((T) obj2), null).toString())<Double.parseDouble(method2.invoke(((T) obj1), null).toString())){ retVal = -1; }else{ retVal = 0; // å€’åº continue; } break; } }else{ retVal =0; continue; } }else{ if(!method1.invoke(((T) obj2), null).toString().equals(method2.invoke(((T) obj1), null).toString())){ retVal = method1.invoke(((T) obj2), null).toString().compareTo(method2.invoke(((T) obj1), null).toString()); // å€’åº break; }else{ retVal =0; continue; } } } } else { if(method1.invoke(((T) obj1), null)==null){ retVal=0; continue; }else if(method2.invoke(((T) obj2), null)==null){ retVal=0; continue; }else { if(sz){ if(!method2.invoke(((T) obj1), null).toString().equals(method1.invoke(((T) obj2), null).toString())){ if(tt.contains("int")){ if(Integer.parseInt(method1.invoke(((T) obj1), null).toString())>Integer.parseInt(method2.invoke(((T) obj2), null).toString())){ retVal =1; break; }else if(Integer.parseInt(method1.invoke(((T) obj1), null).toString())<Integer.parseInt(method2.invoke(((T) obj2), null).toString())){ retVal =-1; break; }else{ retVal=0; continue; } }else if(tt.contains("double")){ if(Double.parseDouble(method1.invoke(((T) obj1), null).toString())>Double.parseDouble(method2.invoke(((T) obj2), null).toString())){ retVal =1; break; }else if(Double.parseDouble(method1.invoke(((T) obj1), null).toString())<Double.parseDouble(method2.invoke(((T) obj2), null).toString())){ retVal =-1; break; }else{ retVal=0; continue; } } }else{ retVal=0; continue; } }else{ if(!method2.invoke(((T) obj1), null).toString().equals(method1.invoke(((T) obj2), null).toString())){ retVal = method2.invoke(((T) obj1), null).toString().compareTo(method1.invoke(((T) obj2), null).toString()); // æ£åº break; }else{ retVal=0; continue; } } } } } } catch (Exception e) { throw new RuntimeException(); } return retVal; } }); // System.out.println("targetList:::::"+Jacksonmethod.tojson(targetList, false)); } }