`
geshenyi
  • 浏览: 100912 次
  • 性别: 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 实现。但是却失去了以上的装饰功能!

分享到:
评论

相关推荐

    JSP+javaBean 博客网

    3. **文章浏览**:展示已发布的文章列表,用户可以按时间、热度等排序查看。 4. **评论功能**:用户可以对文章进行评论,评论也存储在数据库中,显示在文章下方。 5. **用户个人信息管理**:用户可以修改个人资料,...

    JSP+javabean+mysql在线考试系统

    而BOjavabean则封装了具体的业务逻辑,如试题的随机排序、考试时间的控制等,确保考试过程的公正性与规范性。 再者,MySQL作为关系型数据库管理系统,承担着存储和管理所有考试数据的角色。系统中的试题库、考生...

    快速排序Java描述

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

    图书购物网络系统 jsp access javabean

    购物功能允许用户浏览并选择感兴趣的图书,系统应具备搜索、分类、排序等功能,方便用户找到想要的书籍。购物车功能是系统的关键部分,用户可以将选中的图书加入购物车,系统需要记录每本书的数量,并能计算总价。在...

    ireport+ javaBean 做数据源实例

    在实践中,你可能还会遇到诸如数据过滤、分组、排序等问题,ireport都提供了相应的功能来处理这些复杂情况。此外,ireport还可以与其他Java框架(如Spring、Struts等)无缝集成,进一步提高开发效率。通过不断探索和...

    JavaBean 转换为xml的三种方式比较

    这种方法的优点是简单易用,但缺点是功能相对有限,不支持自定义的XML格式,如命名空间、属性排序等。以下是一个简单的示例: ```java XMLEncoder encoder = new XMLEncoder(new FileOutputStream("output.xml"))...

    Web报表开发技术-综合实例-JSP+JavaBean超市销量管理系统

    6. 用户交互:为了提高用户体验,还可以添加过滤、排序、分页等功能,让用户能更方便地查看和分析数据。 本实例的"综合实例-JSP+JavaBean超市销量管理系统"文件可能包含了相关的源代码、数据库脚本、部署文件等,...

    javabean+JSP 网上订购子系统

    2. **商品浏览**:JavaBean可以处理商品列表的获取、筛选和排序,JSP负责展示这些信息。 3. **购物车管理**:用户添加、删除或修改购物车中的商品,JavaBean处理这些操作,并保持购物车状态的同步。 4. **订单创建与...

    ireport利用javabean做数据源实例

    可以自定义单元格样式,如字体、颜色、对齐方式等,也可以添加计算、过滤和排序等复杂逻辑。 6. **运行和测试报表**:完成设计后,可以使用iReport的预览功能查看报表效果。如果数据源正确配置,报表将根据JavaBean...

    JSP+JavaBean留言本

    8. **用户体验**:为了提升用户体验,可以进一步优化界面设计,加入分页功能以加载大量留言,提供搜索和排序选项,以及增加用户注册和权限管理等高级特性。 总结来说,JSP+JavaBean留言本是一个基础的Web应用实例,...

    使用JSP JavaBean来实现对数据库分页显示与搜索

    查询通常包括选择要显示的数据字段,指定排序方式,以及最重要的,使用LIMIT和OFFSET语句实现分页。 2. **创建JavaBean**:创建一个JavaBean类,用于封装每一页的数据。这个类可能包含数据列表和当前页码等属性,...

    SortListView按字母排序改进版

    - 数据模型(如JavaBean或Parcelable)通常包含列表项的全部信息,如名称、ID等。在按字母排序时,关键字段通常是可视化的名称字段。 - 使用ArrayList或更高效的集合类(如TreeSet,它内部已经实现了排序)来存储...

    List<Map>转化为List工具类

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

    jsp+javabean新闻系统

    开发者可以通过setter和getter方法对这些属性进行操作,同时JavaBeans可以实现一些业务逻辑,比如根据日期排序新闻、过滤敏感词等。 3. **MVC设计模式** 在JSP+JavaBean新闻系统中,通常采用Model-View-Controller...

    jsp+mysql+javabean开发的鲤鱼论坛 BBS v1.0(附源码)

    鲤鱼论坛BBS v1.0是一个基于Java技术栈,使用JSP、MySQL数据库和JavaBean进行开发的在线讨论平台。这个系统展示了如何利用这些技术构建一个基础的Web应用程序,为用户提供发布、阅读和回复帖子的功能。以下是关于...

    小虫新闻管理系统 V1.0(jsp+javabean+mysql)

    1. 新闻管理:管理员可以发布、编辑和删除新闻,支持新闻分类和排序,提供搜索功能,方便用户查找所需信息。 2. 用户管理:注册、登录、权限控制等功能,确保只有授权用户才能进行特定的操作,如发布新闻、管理评论...

    基于JSP+JavaBean的网上花店

    JSP页面可以展示这些结果,同时可能还包括分页和排序功能。 3. **购物车**:购物车功能让用户能够选择并暂存要购买的商品。在JSP+JavaBean架构中,购物车通常作为一个JavaBean对象实现,它可以添加、删除或更新商品...

    Android开发之对ListView的数据进行排序.txt

    除了简单的JavaBean对象外,有时我们还需要处理更复杂的数据结构,比如`Map`。下面展示如何对`Map`类型的集合进行排序: ```java List, Object&gt;&gt; listitem = new ArrayList(); Collections.sort(listitem, new ...

    51CTO下载-jsp+servlet+javabean实现的新闻发布系统

    为了支持新闻发布和管理,需要设计合理的数据库查询语句,比如根据时间、类别进行筛选,以及实现新闻的排序和分页功能。 安全性和性能优化也是此类系统需要考虑的问题。例如,使用预编译的SQL语句防止SQL注入攻击,...

    用JSP开发的青鸟学员论坛和商品排序

    4. **EL(Expression Language)**:用于简洁地访问JavaBean中的属性,简化页面逻辑。 5. **JSTL(JavaServer Pages Standard Tag Library)**:使用`&lt;c:if&gt;`, `&lt;c:forEach&gt;`等标签处理条件判断和循环逻辑。 其次,...

Global site tag (gtag.js) - Google Analytics