我们只知道对于数组的排序,针对于Arrays.sort()的排序,对于list对象的排序java8也给了我们方法,使用strem().sorted();
最初的方法
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T obj1, T obj2) {
return obj1.compareTo(obj2);
}
}
针对这个方法,我们通过反射的机制进行处理
/**
* list对对象中的字段进行排序
* @param list 待排序的列表
* @param orderType 排序{0,无序,1,ASC升序;2,DESC降序}
* @param orderByName 实体排序的字段
* */
public static <T> List<T> orderForList(List<T> list, Integer orderType, String orderByName) {
long startTime = System.currentTimeMillis();
// 不需要排序
if(orderType == 0){
return list;
}
if(CollUtil.isEmpty(list) || list.size() <= 1){
return list;
}
//首字母转大写
String newStr = orderByName.substring(0, 1).toUpperCase() + orderByName.replaceFirst("\\w", "");
String methodStr = "get" + newStr;
Field declaredField = null;
boolean stringType = true ;
// 排序类型的获取
try {
declaredField = list.get(0).getClass().getDeclaredField(orderByName);
Class<?> type = declaredField.getType();
if(type.equals(Integer.class) || type.equals(Float.class) || type.equals(Double.class) || type.equals(BigDecimal.class)){
stringType = false;
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
final boolean flag = stringType ;
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T obj1, T obj2) {
int retVal = 0;
try {
Method method1 = ((T) obj1).getClass().getMethod(methodStr, null);
Method method2 = ((T) obj2).getClass().getMethod(methodStr, null);
// 倒序
if (orderType == 2 ) {
// 是否按字符串比较
if(flag) {
// 字符串按 中英文 排序方式
Comparator<Object> chinaSort = Collator.getInstance(Locale.CHINA);
retVal = ((Collator) chinaSort).compare(method2.invoke(((T) obj1), null).toString(),method1.invoke(((T) obj2), null).toString());
// retVal = method2.invoke(((T) obj2), null).toString().compareTo(method1.invoke(((T) obj1), null).toString());
}else {
retVal = Double.valueOf(method2.invoke(((T) obj2), null).toString()).compareTo(Double.valueOf(method1.invoke(((T) obj1), null).toString()));
}
}
// 正序
if (orderType == 1) {
if(flag) {
// 字符串按 中英文 排序方式
Comparator<Object> chinaSort = Collator.getInstance(Locale.CHINA);
retVal = ((Collator) chinaSort).compare(method1.invoke(((T) obj1), null).toString(),method2.invoke(((T) obj2), null).toString());
// retVal = method1.invoke(((T) obj1), null).toString().compareTo(method2.invoke(((T) obj2), null).toString());
}else {
retVal = Double.valueOf(method1.invoke(((T) obj1), null).toString()).compareTo(Double.valueOf(method2.invoke(((T) obj2), null).toString()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return retVal;
}
});
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
return list;
}