posts - 3,  comments - 0,  trackbacks - 0

     看了许多关于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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问