package com.fsmeeting.common;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Comparator;
/**
*
* @description mock db order by</br>
* @author yicai.liu<moon>
*
* @Date 2016年7月22日下午3:10:57
*/
public class MultipleSorter<T> implements Comparator<T> {
// 字段
private String[] field;
private int sort = 1;// 升序
public MultipleSorter(String... field) {
this.field = field;
}
public MultipleSorter(int sort, String... field) {
this.field = field;
this.sort = sort;
}
@Override
public int compare(T left, T right) {
int retval = 0;
for (String param : field) {
try {
retval = compareFiled(getValueByFileld(left, param), getValueByFileld(right, param));
if (0 != retval) {
if (1 == sort) {
retval = -retval;
}
return retval;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return retval;
}
private Object getValueByFileld(T info, String field)
throws IntrospectionException, IllegalAccessException, InvocationTargetException {
Object o = null;
// 根据字段名获取值
Class<? extends Object> clazz = info.getClass();
PropertyDescriptor pd = new PropertyDescriptor(field, clazz);
Method getMethod = pd.getReadMethod();// 获得get方法
o = getMethod.invoke(info);// 执行get方法返回一个Object
return o;
}
/**
*
* @decription </br>
* @author yicai.liu<moon>
* @date 2016年7月22日 下午3:28:07
*/
private int compareFiled(Object left, Object right) {
if (left instanceof String && right instanceof String) {
return ((String) left).compareTo((String) right);
} else if (left instanceof Long && right instanceof Long) {
return ((Long) left).compareTo((Long) right);
} else if (left instanceof Integer && right instanceof Integer) {
return ((Integer) left).compareTo((Integer) right);
} else if (left instanceof BigDecimal && right instanceof BigDecimal) {
return ((BigDecimal) left).compareTo((BigDecimal) right);
} else {
return 0;
}
}
}