package com.videtek.vacp.common.utils;
import com.videtek.vacp.manage.common.utils.StringUtils;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
/**
* @author hehaifeng
* @date 2018-6-6 19:43:55
* @version 1.0
*作用:用于对list里面的元素按照该元素的某一个属性进行ASCII编码排序
*/
public class ComparatorUtil implements Comparator<Object> {
/**
* 倒序排序
*/
private static final String DESC ="desc";
/**
* 正序排序
*/
private static final String ASC ="asc";
/**
* 排序字段
*/
String orderBy=null;
/**
* 排序方式
*/
String orderType="desc";
/**
* 构造函数
*/
public ComparatorUtil(String orderBy,String orderType){
this.orderBy=orderBy;
this.orderType=orderType;
}
/**
* 对list 集合进行排序
* @param list 要排序的list集合
* @param orderBy 要排序的字段:list集合里元素的某一个属性
* @param orderType 排序方式:倒序:desc 正序:asc
*/
public static void orderList(List list, String orderBy, String orderType){
if (list!=null&&list.size()>1&&StringUtils.isNotBlank(orderBy)&&StringUtils.isNotBlank(orderType)){
Collections.sort(list, new ComparatorUtil(orderBy,orderType));
}
}
/**
* 主要排序方法
* @param o1 元素1
* @param o2 元素2
* @return o1>o2 返回值大于0 o1=o2 返回值等于0 o1<o2 返回值小于0
*/
@Override
public int compare(Object o1, Object o2) {
Map<String,String> obj1 =null;
Map<String,String> obj2 =null;
// 将对象统一转成Map集合便于操作
try {
obj1 = ObjectToMapUtil.objectToMap(o1);
obj2 = ObjectToMapUtil.objectToMap(o2);
} catch (IllegalAccessException e) {
e.printStackTrace();
// 如果转map集合异常则不排序
return 0;
}
// 如果传值为 desc 则倒序排序
if (DESC.equals(orderType)){
// 如果传值为 desc 则倒序排序
return isMoreThan(obj1.get(orderBy), obj2.get(orderBy))?-1:1;
}else if(ASC.equals(orderType)){
// 如果传值为 asc 则正序排序
return isMoreThan(obj1.get(orderBy), obj2.get(orderBy))?1:-1;
} else {
// 如果传其他值则不排序
return 0;
}
}
private boolean isMoreThan(String pre, String next){
if(null == pre || null == next || "".equals(pre) || "".equals(next)){
return false;
}
char[] c_pre = pre.toCharArray();
char[] c_next = next.toCharArray();
int minSize = Math.min(c_pre.length, c_next.length);
for (int i = 0; i < minSize; i++) {
if((int)c_pre[i] > (int)c_next[i]){
return true;
}else if((int)c_pre[i] < (int)c_next[i]){
return false;
}
}
if(c_pre.length > c_next.length){
return true;
}
return false;
}
}
List集合按元素某属性排序 工具类
最新推荐文章于 2021-02-26 23:29:56 发布