Java中如果对对象排序可以考虑实现Comparable接口,但是需要排序的属性一旦指定就不能再修改。BeanUtils组件提供了对JavaBean动态排序的支持,即可以在运行时指定排序的属性。实例运行效果如图

BeanComparator通过指定的属性来比较两个bean。它也可以用来比较级联属性、索引属性、映射属性和组合属性等。BeanComparator默认把指定的bean属性传递给ComparableComparator。如果比较的属性值可能有空值,那么应该传递一个合适的Comparator或ComparatorChain给构造方法。

技巧:利用Collections组件的ComparatorUtils类可以实现含有空值的排序,请读者参考相关的API。

(1)编写Employee类,该类定义了3个域:id表示员工的序号,name表示员工的姓名,salary表示员工的薪水,并且提供了相应的get和set方法。代码如下:

 private int id;
private String name;
private double salary; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public double getSalary() {
return salary;
} public void setSalary(double salary) {
this.salary = salary;
} @Override
public String toString() {
return "员工编号:" + id + ",员工姓名:" + name + ",员工工资:" + salary;
}
}

(2)编写Test类,在该类的main()方法中创建了3个Employee对象并进行初始化,然后使用salary域进行排序。代码如下:

package com.mingrisoft.beanutils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import org.apache.commons.beanutils.BeanComparator; public class Test {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Employee employee1 = new Employee();// 创建employee1对象并初始化
employee1.setId(1);
employee1.setName("IBM");
employee1.setSalary(10000);
Employee employee2 = new Employee();// 创建employee2对象并初始化
employee2.setId(2);
employee2.setName("Oracle");
employee2.setSalary(1000);
Employee employee3 = new Employee();// 创建employee3对象并初始化
employee3.setId(3);
employee3.setName("Sun");
employee3.setSalary(100);
List<Employee> list = new ArrayList<Employee>();// 创建list对象并保存全部员工对象
list.add(employee1);
list.add(employee2);
list.add(employee3);
System.out.println("排序前:");
for (Employee employee : list) {
System.out.println(employee);// 输出所有对象
}
Collections.<Employee> sort(list, new BeanComparator("salary"));// 进行排序
System.out.println("按工资排序后:");
for (Employee employee : list) {
System.out.println(employee);// 输出所有对象
}
}
}

心法领悟:动态排序的原理。

BeanComparator实现了Comparator接口,利用反射根据指定的属性值来排序。使用该类的方法比自己实现该功能要好很多,希望读者认真掌握。

动态排序JavaBean的更多相关文章

  1. ActiveReports 报表应用教程 (9)---交互式报表之动态排序

    在 ActiveReports 中除了提供对数据源进行排序的功能之外,还提供了最终用户排序功能,最终用户可以对报表进行区域内排序和整个数据源排序,结合数据钻取.过滤等功能可以让用户更方便地分析报表数据 ...

  2. linq扩展之动态排序

    前两天看QQ群里面,一位朋友问的问题,说在linq中怎么实现动态排序呢,自己想了半天,没有头绪,网上找了下相关的资料,看了下,收益挺多,记录下来. 之前我们没有如果不知道动态排序的方法的话,我们可能会 ...

  3. excel动态去重和动态排序

    其实去重和排序的方法很多,没有哪一种更好,实时去重总会省一些时间,刚好也练习了下数组公式 动态去重: =IF(ROW()<=COUNTA(员工基础数据!H:H),INDEX(员工基础数据!H:H ...

  4. php sortable 动态排序

    php sortable 动态排序未分页版.php 预览图: <?php mysql_connect("localhost","root","r ...

  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为s ...

  6. LinQ动态排序

    LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使2 ...

  7. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

  8. 使用cglib动态创建javabean

    动态创建javabean对于我们进行开发,会有一定的帮助,一下是使用cglib动态创建javabean的一个例子: 先贴上code: package com.dalong.CreateCode; im ...

  9. Java如何操作对象(bean)进行动态排序?

    原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...

随机推荐

  1. 详解MySQL分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...

  2. sqlalchemy多表联合查询的左连接、右连接等使用

    #按用户名摸糊查询trans_details.query.join(Uses).filter(Users.username.like('%xx%'))#select xxx from trans_de ...

  3. server证书安装配置指南(Tomcat 6)

    一.   生成证书请求   1.  安装JDK 安装Tomcat须要JDK支持. 假设您还没有JDK的安装.则能够參考 Java SE Development Kit (JDK) 下载. 下载地址: ...

  4. Scala-LIST/Tuple/Map

    环境: CentOS 6.3 LIST(列表) 代码: $ cat list.scala var mylist = List(1,2,3) println(mylist) var mylist1 = ...

  5. 【C++ STL应用与实现】18: 怎样使用迭代器适配器

    本系列文章的文件夹在这里:文件夹. 通过文件夹里能够对STL整体有个大概了解 前言 本文介绍了STL中的迭代器适配器(iterator adapter)的概念及其用法演示样例.迭代器适配器能够和标准库 ...

  6. c++命令提示符窗体下打印指定大小的菱形代码

    c++命令提示符窗体下打印指定大小的菱形代码 VS2010下,新建空项目.加入源文件,将代码粘贴进去就能够了. 通过改maxRows值的大小,能够控制菱形的大小 #include <stdio. ...

  7. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. April Fools Day Contest 2014 H. A + B Strikes Back

    H. A + B Strikes Back time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. Selenium Webdriver弹出框 微博分享的内容控制与结果生成

    browser.window_handles for i in ugc_url_l: js = 'window.location.href="{}"'.format(i) brow ...

  10. ASP.NET调用存储过程并接收存储过程返回值

    ASP.NET调用存储过程并接收存储过程返回值 2010-08-02 11:26:17|  分类: C#|字号 订阅       2010年02月27日 星期六 23:52 假设表结构Create T ...