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

 

  public   boolean  isAsc()  ... {

  return isAsc;

  }

  public   void  setAsc( boolean  isAsc)  ... { this .isAsc  =  isAsc;

  }

  public  String getPropertyName()  ... {

  return propertyName;

  }

  public   void  setPropertyName(String propertyName)  ... { this .propertyName  =  propertyName;

  }

  public   int  getDataType()  ... {

  return dataType;

  }

  public   void  setDataType( int  dataType)  ... { this .dataType  =  dataType;

  }

  }

  这里是重点,这个对象知道如何根据order规则来排序,comparator就是调用这个对象的compare方法来获得比较结果,由于 EmployeeOrder对象中定义了对象属性的排序方法,所以这个对象中使用的java的反射来获得具体属性值,并根据不同的属性类型进行比较,如果一共有3条比较规则,那么在比较2个Employee对象是先从第一个规则开始比较,如果比较出来一样,那么在进行第二个规则的比较,否则退出比较.由于本人很懒所以只对其中的一部分属性类型给出了比较方法,并没有实现所有数据类型的比较,大家可以自己实现,呵呵.

  /** */ /**

  *

  */

  package  com.demo.sort;

  import  java.lang.reflect.Field; import  java.math.BigDecimal; import  java.util.List;

  /** */ /**

  *

  */

  public   class  EmployeeSortOrder  implements  ISortOrder  ... {

  private List < EmployeeOrder > orders;

  public  EmployeeSortOrder(List < EmployeeOrder >  orders)  ... { this .orders  =  orders;

  }

  public   int  compare(Object arg0, Object arg1)  ... {

  int result = 0 ;

  try   ... {

  Employee e1 = (Employee) arg0;

  Employee e2 = (Employee) arg1;

  for  (EmployeeOrder order : orders)  ... { Object v1 = getVaule(e1,order.getPropertyName()); Object v2 = getVaule(e2,order.getPropertyName()); result = sort(v1,v2,order.getDataType()); if ( ! order.isAsc()) ... {

  result *=- 1 ;

  }

  if (result != 0 ) ... {

  break ;

  }

  }

  }   catch  (Exception e)  ... {

  // TODO: handle exception

  }

  return result;

  }

  private   int  sort(Object v1,Object v2, int  dataType) ... {

  int result = 0 ;

 switch  (dataType)  ... { case  EmployeeOrder._STRING:

  String s1 = (String)v1;

  String s2 = (String)v2;

  result = s1.compareTo(s2);

  break ;

  case  EmployeeOrder._BIGDECIMAL:

  BigDecimal d1 = (BigDecimal)v1;

  BigDecimal d2 = (BigDecimal)v2;

  result = d1.compareTo(d2);

  break ;

  case  EmployeeOrder._LONG:

  Long l1 = (Long)v1;

  Long l2 = (Long)v2;

  result = l1.compareTo(l2);

  break ;

  default :

  result = 0 ;

  break ;

  }

  return result;

  }

  private  Object getVaule(Object obj,String propertyName) ... {

  Object result = null ;

  try   ... { Class clazz  =  obj.getClass(); Field field  =  clazz.getDeclaredField(propertyName); field.setAccessible( true ); result  =  field.get(obj); }   catch  (Exception e)  ... { e.printStackTrace();

  }

  return result;

  }

  }

  没多说的,测试类.

  package  com.demo.sort;

  import  java.math.BigDecimal; import  java.util.ArrayList; import  java.util.Calendar; import  java.util.Collections; import  java.util.Date; import  java.util.List;

  import  junit.framework.TestCase;

  public   class  EmployeeSortTest  extends  TestCase ... {

  private List < Employee > employeeList;

  @Override

  protected   void  setUp()  throws  Exception  ... { super .setUp();

  Employee e;

  Date date;

  Calendar cal = Calendar.getInstance();

  employeeList = new ArrayList < Employee > ();

  for  ( int  i = 0 ;i < 10 ;i ++ )  ... {

  e = new Employee();

  if ( 0 == i % 3 )

  cal.add(Calendar.DATE,  1 ); date = cal.getTime(); e.setBirthday(date); e.setEmployeeId(Long.valueOf(i)); e.setFirstName( " firstName " + i / 2 ); e.setLastName( " LastName " + i * 3 ); e.setPayment( new  BigDecimal(i % 3 )); employeeList.add(e);

  }

  }

  @Override

  protected   void  tearDown()  throws  Exception  ... { super .tearDown();

  }

  public   void   testSort() ... {

  List < EmployeeOrder > orders = new ArrayList < EmployeeOrder > ();

  EmployeeOrder order = new  EmployeeOrder( " firstName " , false ,EmployeeOrder._STRING); orders.add(order); order = new  EmployeeOrder( " employeeId " , false ,EmployeeOrder._LONG); orders.add(order);

  ISortOrder sortOrder = new EmployeeSortOrder(orders);

  EmployeeComparator comparator = new EmployeeComparator(sortOrder);

  Collections.sort(employeeList,comparator); for  (Employee employee : employeeList)  ... { System.out.println(employee);

  }

  }

  }

上一页  [1] [2] 

责任编辑:小草

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