compare 应用实例

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

猜你喜欢

转载自tree-161219.iteye.com/blog/1124656
今日推荐