看了许多关于Comparator接口的实现和解决方法,感觉大多都不是太符合jdk的原意。
Comparator接口是对Comparable接口的另一种补充。她使数据和算法分离。(在比较的时候) Comparable接口是数据和算法绑定,这本身并没有好和坏的分别,只是不同的角度去思考同一问题。因此从分离的角度出发,Comparator接口对比较的两个对象要求的类型更加的随意,而java 反射机制正是对这一需求的一个合理解决方案。我们在得到比较的两个对象时,比较大小,其实就是比较他们某个属性的大小,决定返回的是-1,0,1中的一个。而属性的结果是通过方法返回的,所以我们可以通过反射得到他的方法集合,循环方法去得到希望的属性。具体的希望属性,需要用户提供比如年龄,工资,或者其他属性。这样就做到了比较并且分离算法和数据。
反射的必要条件: object1,object2,field
代码:public int compare( Object o1, Object o2 ) {
Object result1 = getValue( o1 , field)
Object result2 = getValue( o2 , field);
//
if( result1 instanceof Date && result2 instanceof Date )
if(orderFlag.equals("asc"))
return ((Date)result1).compareTo((Date)result2);
else
{
if(((Date)result1).compareTo((Date)result2) < 0 )
return 1;
if(((Date)result1).compareTo((Date)result2) > 0)
return -1;
}
//
if( result1 instanceof String && result2 instanceof String ) {
if( result1.toString().equals( result2.toString() ) )
return 0;
else
return -1;
}
//其他类型的比较!!!
return 0
}
private Object getValue( Object obj , String fileName ) {
Method[] methods = obj.getClass().getMethods();
Object value = null;
for(Method method: methods){
String name = method.getName();
if(name .equals("get") && name .toLowerCase().indexOf(fileName )){
try{
value = method.invok(obj ,new Object[]{});
}catch(Exception e){e.printStackTrace();}
break;
}
}
return value;
}
posted on 2008-12-18 16:14
jk 阅读(191)
评论(0) 编辑 收藏