`
geshenyi
  • 浏览: 98677 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVABean 排序

    博客分类:
  • J2SE
阅读更多
众所周知,如果需要在 Java 中使用排序方法,那么就需要实现 Comparable 接口。

public interface java.lang.Comparable {

          public int compareTo(Object o);

}

Comparable 接口很简单,因为它只有一个方法;然而如果你需要根据多 个属性对对象进行排序,

那么实现 compareTo 方法就会变得很复杂。

下边就是一个摘自 Jakarta Commons cookbook 的例子:

package com.discursive.jccook.collections.compare; 


import java.util.*; 


import org.apache.commons.lang.StringUtils; 


import org.apache.commons.collections.comparators.ReverseComparator; 

  

public class BookComparator implements Comparator { 

   
public int compare(Object o1, Object o2) { 

        
   int comparison = -1; 

       
    if( o1 instanceof Book && o2 instanceof Book ) { 



            Book b1 = (Book) o1; 


            Book b2 = (Book) o2; 


             String b1Name = b1.getName( ); 


             String b2Name = b2.getName( ); 


             String b1Author = b1.getAuthor( ); 


             String b2Author = b2.getAuthor( ); 


            if( StringUtils.isNotEmpty( b1Name ) && 


               StringUtils.isNotEmpty( b2Name ) ) { 


                 comparison = b1Name.compareTo( b2Name ); 


            } 


            if( comparison == 0 && 


                StringUtils.isNotEmpty( b1Author ) && 


                StringUtils.isNotEmpty( b2Author ) ) { 


                comparison = b1Author.compareTo( b2Author ); 


            }   


        } 


        return comparison; 


    } 


}


该事例是对一个称为 book 的 bean 进行排序,将会根据 name 和 author

两个属性进行排序。当我们使用的时候,就可以类似于以下的形式。


     Arrary.sort(books,BookComparator) 或者 collections.sort

(books,BookComparator). 当中的两个参数是要排序的数组或者 list 以及使

用的 Comparator 。下边主要说的就是怎样构造 Comparator 。


本文的是展示怎样使用 commons 的组件,来完成 Comparator 的构造。


对单一 bean 的单个属性排序

       现在如果我们只是想对 bean 中的一个属性进行排序的话。那么只需要构造

出一个 BeanComparator 的实例就可以了 .


形式如下:


private BeanComparator comparator = new BeanComparator("name");


       这样子我们就构造出了一个根据 ”name” 属性来对集合中的 bean 进行排

序的比较器。当集合中的 bean 有 name 这个属性的时候,那么排序时就会依照

这个排序器来调整集合中 bean 的顺序。


    BeanComparator 是 BeanUtils API 中的一个类,使用它可以很简单地根

据 bean 的属性对 Bean 类进行排序。


       需要说明的是这个比较器只是对符合 javabean 规范的类进行比较,如果类

中没有这个属性或者属性没有 get 和 set 方法,那么在比较的时候就会抛出

ClassCastException 。


装饰比较器

       上边生成的比较器是带有一些默认的排序规则的,比如按着自然顺序排列,

当遇到字符串的值是“”的时候就排列在前端。下边我将说明怎么改变这种默认

的规则。


       为了完成这个任务,我们就需要使用 commons.collections.comparators

提供的几个装饰类,ReverseComparator,NullComparator,

FixedOrderComparator或者ComparatorUtils这个实用类。



    下边分别说明反序排列,允许空值排列和自定义顺序排列的实现方法。


    当我们想对让一个比较器按着反序进行排列的时候,可以使用如下的形

式:


      comparator = new ReverseComparator(comparator);


       需要说明的是:这个功能的实现可以在排完序后对要排序的 array 或者

list 调用其 reverse ()方法即可。但是这种做法并不适合下边谈到的对

bean 的多字段排序时,而只对某一个字段逆序的情况。

     当对一个比较器进行特定顺序排列时需要用到FixedOrderComparator 。

这个类用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序。

具体的事例如下:

String[] severityOrder = { "Critical", "Minor", "Enhancement" };

Comparator severityComparator = new FixedOrderComparator    (severityOrder);

Comparator comparator=new BeanComparator("title",severityComparator) ;

如上的程序便可以对 bean 的 title 属性按着数组中特定

的顺序进行排序!

最后需要说明的是,以上谈到的几个装饰在 ComparatorUtils 这个实用类中也提供了支持。

具体使用如下:

按着 bean 的属性为 null 时进行排序,可以选择属性为 null 时排在前边还是后边!

ComparatorUtils.nullLowComparator(comparator);  或者 ComparatorUtils.nullHighComparator(comparator);

当对一个排序器逆序时:

ComparatorUtils.reversedComparator(mycmp); // 逆序

 

多个属性的排序
当我们想对 bean 的多个属性进行排序的时候,需要用到 commons.collections. ComparatorChain 。这个类 定义一组Comparator链,链中的Comparator对象会被依次执行。我们可以通过该类的 addComparator() 方法进行将当个的 comparator 对象加入到 comparator 链中,当使用的时候就可以和使用单个 comparator 一样。因为 comparatorChain 也继承了 comparator 的借口。当我们添加单个的 comparator 的时候,就可以利用上边谈到的对 comparator 进行装饰。

ComparatorChain comparatorChain = new ComparatorChain( );

comparatorChain.addComparator( new BeanComparator( "name" ) );

comparatorChain.addComparator( new BeanComparator( "author" ) );

comparaterChain.addComparator( new ReverseComparator                                                        (new BeanComparator("author") );

      具体使用的时候如下:

    Arrays.sort( books, comparatorChain );

  这个样子就可以将这个 comparator 传给 sort ()方法。当谈到对 bean 的多字段排序,而只对某一个字段逆序的情况时,可以参考如下的实现。

      ComparatorChain comparatorChain = new ComparatorChain( );

     comparatorChain.addComparator( new BeanComparator( "name" ) );

        这样子就可以实现了对 bean 的 name 按着正序排列而对 author 属性按着逆序排列。

对组合 bean 进行排序
       当一个 bean 的某个属性是另外一个 java bean 的时候,而我们有想按着那个被组合进来 bean 的某个属性进行排序的时候,我们只需要很简单的将 BeanComparator 的参数设定成 bean.property 的形式,比如想对按着 book 的 author 中的 title 属性进行排序的时候就可以参考以下的形式:

new BeanComparator

("author.title",severityComparator))

Comparable 接口的实现

       最后如果想对 author 类实现 Comparable 接口可以参考如下的实现:

public class Book implements Comparable {

public int compareTo(Object arg0) {

// comparators setup

String[] severityOrder = { "Critical", "Major", "Minor", "Enhancement" };

// 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;

Comparator severityComparator = new FixedOrderComparator(severityOrder);

ComparatorChain compChain = new ComparatorChain();

       // 通过为属性指定一个已经存在的 Comparator ,而非采用默认的自然顺序

compChain.addComparator(new BeanComparator("author.

title", severityComparator));

     compChain.addComparator(new NullComparator

(new BeanComparator("name"), true));

compChain .addComparator(new ReverseComparator

(new BeanComparator("id")));

     return compChain.compare(this, arg0);

    }

}

   另外一个实现思路是:利用 commons.lang.compareBulder 实现。但是却失去了以上的装饰功能!

分享到:
评论

相关推荐

    快速排序Java描述

    利用分治法思想实现快速排序,Java语言描述。

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List, Object&gt;&gt;转化为JavaBean工具类...

    commons-beanutils-1.9.1解析javaBean方式

    2.beanCompartor 动态排序 3.Converter 把Request或ResultSet中的字符串绑定到对象的属性 4.1 PropertyUtils,当属性为Collection,Map时的动态读取 4.2 PropertyUtils,获取属性的Class类型 4.3 ConstructorUtils...

    java项目源码之新闻发布(提供JavaBean)的实现.rar

    新闻展示:用户可以通过系统的前台界面浏览最新的新闻内容,系统会按照一定的排序规则展示新闻列表,用户可以点击查看详细内容。 新闻评论:用户可以对新闻进行评论和讨论,与其他用户交流看法和观点。管理员可能...

    javaweb研究生实验室管理系统

    可以看到按照时间排序的会议,包括会议名称,会议备注,汇报人员。点击会议可以看到汇报和讨论记录 4、创建我的项目 可以创建一个新的项目,填写项目名称和项目描述,设置项目是否所有人可见。我上传的代码可以属于...

    JBuilder开发人员指南

    十二、过滤、排序与定位数据 十三、把功能添加到数据库应用程序 十四、其他控件和事件的使用 十五、创建分布式数据库应用程序 十六、用Data Modeler和Application Generator创建数据库应用程序 十七、数据库管理任务...

    Java编写学生成绩管理(含源码)

    (2)采用各种排序对所有同学的总分进行排序(可升降序)。 (3)将上述同学的各科成绩和总分成绩打印在界面上。 显示导入成功的时候,要将窗口拉大一点,表格才会出现,不知道是什么bug。 要是.xls的文件才可以...

    ExcelTool:灵活简单,将javabean数据转换成excel

    灵活排序 可以很方便地调整每列的先后顺序 宽度自适应 针对中文做优化,确保excel表格能依据文字宽度确定每个表格宽度 值类型自动识别 检测每个表格的内容,是数字、字符串、还是时间,依据类型的不同,做人性化、...

    java学习资料

    Day07:java 的排序算法介绍 Day08:java 的面向对象基础 Day09:java 面向对象(二) Day10:javaBean 介绍和父类子类转换 Day11:java 的抽象类和接口 Day12:String 类和字符编码介绍 Day13:正则表达式和包装类 ...

    自定义java常见工具类

    java开发中常用的工具类 比如 1:hibernate的配置 工具类复写 2:字符串加密 MD5加密 3:javabean到map的自动映射封装 4:javabean java对象到xml的自动封装 ...8:各种排序算法 9:其他很多。。。想看 下载吧

    mybatisPlus拦截器实现sql条件驼峰转下划线

    mybatisPlus的queryWrapper查询条件我们一般都是写死带下划线(如:create_time),但是如果用@FieldNameConstants注解的files字段去当条件的话,是驼峰,sql语句报找不到列,所以期望这里会自动帮我们把驼峰转下划线...

    廖雪峰 Java 教程.doc

    数组排序 多维数组 命令行参数 面向对象编程 面向对象基础 方法 构造方法 方法重载 继承 多态 抽象类 接口 静态字段和静态方法 包 作用域 classpath和jar 模块 Java核心类 字符串和编码 ...

    超级有影响力霸气的Java面试题大全文档

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 14、...

    java 面试题 总结

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例237 动态排序JavaBean 298 10.5 其他Commons组件简介 299 实例238 优雅的JDBC代码 299 实例239 结果集与Bean列表 301 实例240 编写MD5查看器 302 实例241 基于Base64编码 304 实例242 基于Base64解码 305 实例...

    Java核心技术II(第8版)

    8.9.1 JavaBean持久化可用于任何数据 8.9.2 一个JavaBean持久化的完整示例 第九章 安全 9.1 类加载器 9.1.1 类加载器的层次结构 9.1.2 将类加载器作为命名空间 9.1.3 编写你自己的类加载器 9.2 字节码校验 9.3 安全...

Global site tag (gtag.js) - Google Analytics