整理2个compare 接口排序的实现方法:
一、 自己实现比较方法,包括一些复杂的多条件比较
public class Comparator {
private String mothdName;
/**
* 比较器,可以根据具体VO定制排序
* @param mothdName
* @return
*/
public java.util.Comparator getComparator(final String mothdName) {
this.mothdName = mothdName;
return new java.util.Comparator() {
public int compare(Object o1, Object o2) {
if (o1 instanceof String) {
return compare((String) o1, (String) o2);
} else if (o1 instanceof Integer) {
return compare((Integer) o1, (Integer) o2);
}else if (o1 instanceof Timestamp) {
return compare((Integer) o1, (Integer) o2);
}else if (o1 instanceof Date) {
return compare((Integer) o1, (Integer) o2);
} else if (o1 instanceof BpmTaskVo) {
return compare((BpmTaskVo) o1, (BpmTaskVo) o2);
} else {
System.err.println("未找到合适的比较器");
return 1;
}
}
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
public int compare(Boolean o1, Boolean o2) {
return o1.compareTo(o2);
}
public int compare(Timestamp o1, Timestamp o2){
return o1.compareTo(o2);
}
public int compare(Date o1, Date o2){
return o1.compareTo(o2);
}
//为BpmTaskVo 定制排序
public int compare(BpmTaskVo vo1, BpmTaskVo vo2) {
Class<BpmTaskVo> voClass = BpmTaskVo.class;
Method mothdGet;
// mGet.setAccessible(true);//因为写成private 取值可以不设置
int i = 0;
try {
mothdGet = voClass.getDeclaredMethod(mothdName);
Object o1 = mothdGet.invoke(vo1);
Object o2 = mothdGet.invoke(vo2);
// System.out.println("方法名"+mothdName + "比较值o1 = "+o1 + " o2 = "+o2);
i = compare(o1,o2);
} catch (Exception e) {
e.printStackTrace();
}
return i;
}
// 多条件比较
public int compare(BpmTaskVo o1, BpmTaskVo o2) {
String firstname1 = o1.getFirstName();
String firstname2 = o2.getFirstName();
String lastname1 = o1.getLastName();
String lastname2 = o2.getLastName();
Boolean sex1 = o1.getSex();
Boolean sex2 = o2.getSex();
Integer age1 = o1.getAge();
Integer age2 = o2.getAge();
return (compare(firstname1, firstname2) == 0 ? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 : compare(age1, age2)) : compare(sex1, sex2)) : compare(lastname1, lastname2)) : compare(firstname1, firstname2));
}
};
}
}
二、 利用反射和compareTo,动态比较。这种是比较好的方法
public class RmComparator {
/**
* 比较器,可以根据VO具体字段比较
*
* @param mothdName
* @return
*/
public Comparator getComparator(final String mothdName) {
return new Comparator() {
public int compare(Object o1, Object o2) {
int val = 0;//默认不排序
try {
if (mothdName == null) {
val = myCompare(o1, o2);
} else {
val = myCompare(getValue(o1, mothdName), getValue(o2, mothdName));
}
} catch (Exception ex) {
ex.printStackTrace();
}
return val;
}
// VO中取值
public Object getValue(Object bean, String methodName) throws Exception {
Method getMethod = bean.getClass().getMethod(methodName, null);
return getMethod.invoke(bean, null);
}
// 具体执行比较的方法
public int myCompare(Object obj1, Object obj2) throws Exception {
if (obj1 == null || obj2 == null){
return obj1 == null ? -1 : 1;
}
Class cl = obj1.getClass();
if (obj1 instanceof java.lang.Comparable) {
// byte int long float..number, date , boolean , char,String
Method getMethod = obj1.getClass().getMethod("compareTo", new Class[] { cl });
return (Integer) getMethod.invoke(obj1, new Object[] { obj2 });
}
return 0;//默认不排序
}
};
}