看了許多關(guān)于Comparator接口的實現(xiàn)和解決方法,感覺大多都不是太符合jdk的原意。
Comparator接口是對Comparable接口的另一種補充。她使數(shù)據(jù)和算法分離。(在比較的時候) Comparable接口是數(shù)據(jù)和算法綁定,這本身并沒有好和壞的分別,只是不同的角度去思考同一問題。因此從分離的角度出發(fā),Comparator接口對比較的兩個對象要求的類型更加的隨意,而java 反射機制正是對這一需求的一個合理解決方案。我們在得到比較的兩個對象時,比較大小,其實就是比較他們某個屬性的大小,決定返回的是-1,0,1中的一個。而屬性的結(jié)果是通過方法返回的,所以我們可以通過反射得到他的方法集合,循環(huán)方法去得到希望的屬性。具體的希望屬性,需要用戶提供比如年齡,工資,或者其他屬性。這樣就做到了比較并且分離算法和數(shù)據(jù)。
反射的必要條件: 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;
}