java:对复杂对象排序的模型及其实现
来源:优易学  2011-10-29 10:42:28   【优易学:中国教育考试门户网】   资料下载   IT书店

  排序是编程中经常要碰到的问题,如果只是一般的数据库数据那么我们完全可以用数据sql语言来排序,但有的时候情况并不是这样,在一些特殊情况下我们不得不自己在java中写一些排序,而通常排序是一件让程序员非常恼火的事情,特别是那些可以让用户自由选择排序规则的情况,想想就头疼.今天正好公司一个组件就碰到了这样的情况,下面我说一下怎么来完成并且实现排序.

  首先让我们来看一下用户需求是怎么样(为了更容易理解我将用户需求简化了一下,实际情况可能更复杂), 一个财务人员需要查询公司内所有用户的数据信息,对于查询出来的结果该用户能够自己定义排序规则(例如,他希望对用户姓名进行升序,同时对工资进行降序, 并且对生日进行升序,也许有人会说这个直接用sql就能完成,请注意,这个用例是我简化了的,真实的情况会非常复杂,同时并不是一条sql就能解决的).

  对于这个需求我们第一个想到的应该有一个员工信息对象(Employee),用户姓名,工资,生日都是这个对象的属性.用户的查询结果就是 Employee对象的List.我们知道java本身提供了一个非常好的对于List的排序方法Collections.srot(List <T> list, Comparator  c ), 如果我们有一个针对Employee的Comparator对象他知道如何对两个Employee对象进行比较,根据比较结果来决定Employee对象的排列顺序,这样就能够实现用户的需求.第二点,用户能够自己定义一组排序规则,那么我们应该有一个EmployeeSortOrder对象,它包含了所有用户所定义的每一条规则,从需求理解我们可以知道这些规则就是对Employee对象中某些属性定义他的排序规则(升序或者降序),那么我们可以通过引入一个(EmployeeOrder)对象来指明具体Employee对象中有的属性如何来排序,这里需要包括这些属性的类型,应该对于不同的属性比较方式是不一样的.需求分析到这里我们基本就可以得到一个实现排序的模型.

  下面我们来看一下具体代码:

  Employee对象,一个标准的javabean对象,实际情况可能会是一个更加复杂的对象

  /** */ /**

  *

  */

  package  com.demo.sort;

  import  java.math.BigDecimal; import  java.util.Date;

  /** */ /**

  *

  */

  public   class  Employee  ... {

  private Long employeeId;

  private String firstName;

  private String lastName;

  private Date birthday;

  private BigDecimal payment;

  public  Date getBirthday()  ... {

  return birthday;

  }

  public   void  setBirthday(Date birthday)  ... { this .birthday  =  birthday;

  }

  public  Long getEmployeeId()  ... {

  return employeeId;

  }

  public   void  setEmployeeId(Long employeeId)  ... { this .employeeId  =  employeeId;

  }

  public  String getFirstName()  ... {

  return firstName;

  }

  public   void  setFirstName(String firstName)  ... { this .firstName  =  firstName;

  }

  public  String getLastName()  ... {

  return lastName;

  }

  public   void  setLastName(String lastName)  ... { this .lastName  =  lastName;

  }

  public  BigDecimal getPayment()  ... {

  return payment;

  }

  public   void  setPayment(BigDecimal payment)  ... { this .payment  =  payment;

  }

  @Override

  public   int  hashCode()  ... {

  // TODO Auto-generated method stub

  return   super .hashCode();

  }

  @Override

  public  String toString()  ... {

  StringBuffer buf = new StringBuffer();

  buf.append( " [ " ); buf.append( " employeeId= " + employeeId).append( "  , " ); buf.append( " firstName= " + firstName).append( "  , " ); buf.append( " lastName= " + lastName).append( "  , " ); buf.append( " birthday= " + birthday).append( "  , " ); buf.append( " payment= " + payment); buf.append( " ] " ); return  buf.toString();

  }

  }

  Employee的complarator对象,他调用了ISortOrder来获得比较结果,这样我们就能够将具体的比较算法留到下层来实现,一旦Employe的比较规则改变,这个类也不需要在理会了.

  /** */ /**

  *

  */

  package  com.demo.sort;

  import  java.util.Comparator;

  /** */ /**

  *

  */

  public   class  EmployeeComparator  implements  Comparator  ... {

  ISortOrder sortOrder;

  public  EmployeeComparator(ISortOrder sortOrder) ... { this .sortOrder = sortOrder;

  }

  /**/ /* (non-Javadoc)

  * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)

  */

  public   int  compare(Object arg0, Object arg1)  ... { return  sortOrder.compare(arg0,arg1);

  }

  }

  /** */ /**

  *

  */

  package  com.demo.sort;

  /** */ /**

  *

  */

  public   interface  ISortOrder  ... {

  public   int  compare(Object arg0, Object arg1);

  }

  具体的排序规则对象,这个对象记录了Employee对象中具体属性的排序规则和属性类型,如果用户定义了多条规则那么没一条规则就应该对于一个实例.

  /** */ /**

  *

  */

  package  com.demo.sort;

  /** */ /**

  *

  */

  public   class  EmployeeOrder  ... {

  public final static int _LONG = 0 ;

  public final static int _STRING = 1 ;

  public final static int _DATE = 2 ;

  public final static int _BIGDECIMAL = 3 ;

  private String propertyName;

  private boolean isAsc;

  private int dataType;

  public  EmployeeOrder(String propertyName,  boolean  isAsc, int  dataType)  ... { this .propertyName  =  propertyName; this .isAsc  =  isAsc; this .dataType = dataType;

  }

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训