设为首页 加入收藏

TOP

java中对于复杂对象排序的模型及其实现
2014-11-23 22:12:34 】 浏览:407
Tags:java 对于 复杂 对象 排序 模型 及其 实现

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


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


  对于这个需求我们第一个想到的应该有一个员工信息对象(Employee),用户姓名,工资,生日都是这个对象的属性.用户的查询结果就是 Employee对象的List.我们知道java本身提供了一个非常好的对于List的排序方法Collections.srot(List 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();


  }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Notify()和notifyall()的原理 下一篇java中游标的应用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目