整理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;//默认不排序 } }; }