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