对象属性的排序

  主要是利用jakarta的common提供的方面来进行排序。具体演示看代码

 1、创建一个需要排序的对象

  1. public class SignMessage {
  2.     
  3.     private long id;
  4.     
  5.     private String name;
  6.     
  7.     private int count;
  8.     public long getId() {
  9.         return id;
  10.     }
  11.     public void setId(long id) {
  12.         this.id = id;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public int getCount() {
  21.         return count;
  22.     }
  23.     public void setCount(int count) {
  24.         this.count = count;
  25.     }
  26. }

创建我们的排序类,将分为对单个属性的升序降序排列。对多个属性的升序降序排列,对多个属性的升序降序排列将采用自我实现比较接口的方式和使用排序chain方式进行实现

  1. package com.kongqz.test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. import org.apache.commons.beanutils.BeanComparator;
  7. import org.apache.commons.collections.comparators.ComparatorChain;
  8. import org.apache.commons.collections.comparators.ReverseComparator;
  9. /**
  10.  * 针对javabean的某个属性或者多个属性做排序处理
  11.  * @author kongqz
  12.  * @date 2008-09-22
  13.  * 
  14.  * */
  15. public class CompareTest {
  16.     
  17.     /**
  18.      * 初始化一个需要排序的集合
  19.      * */
  20.     public List<SignMessage> initData(){
  21.         
  22.         List<SignMessage> tmp = new ArrayList();
  23.         for(int i=100;i>0;i--){
  24.             
  25.             SignMessage sm = new SignMessage();
  26.             sm.setId(i);
  27.             if(i<50){
  28.                 sm.setCount(i+10000);
  29.             }else{
  30.                 sm.setCount(i+9950);
  31.             }
  32.             
  33.             sm.setName("kongqz"+i);
  34.             tmp.add(sm);
  35.             
  36.         }
  37.         for(SignMessage sm:tmp){
  38.             System.out.println(sm.getName()+"-["+sm.getCount()+"]");
  39.         }
  40.         return tmp;
  41.     }
  42.     /**
  43.      * 对对象的单个属性count进行排序
  44.      * @author kongqz
  45.      * */
  46.     public List<SignMessage> orderSM(List<SignMessage> smList){
  47.         //创建针对某个属性的升序比较
  48.         Comparator countCompare = new BeanComparator("count");
  49.         //默认的是升序,整一个降序
  50.         countCompare=new ReverseComparator(countCompare);
  51.         //开始排序
  52.         Collections.sort(smList,countCompare);
  53.         return smList;
  54.     }
  55.     
  56.     /**
  57.      * 直接实现排序的Comparator接口。重构其比较函数,让我们的业务逻辑直接写入
  58.      * @author kongqz
  59.      * */
  60.     public List<SignMessage> orderMutiSM(List<SignMessage> smList){
  61.         
  62.         Comparator ccc =new Comparator() {
  63.             public int compare(Object o1, Object o2) {
  64.                 SignMessage sm1 = (SignMessage) o1;
  65.                 SignMessage sm2 = (SignMessage) o2;
  66.                 
  67.                 //请在此处扩展你的计算逻辑
  68.                 int count1 = sm1.getCount();
  69.                 int count2 = sm2.getCount();
  70.                 
  71.                 Integer ct1 = new Integer(count1);
  72.                 Integer ct2 = new Integer(count2);
  73.                 if(count1!=count2){
  74.                      //升序降序通过ct2和ct1谁在前控制
  75.                      return ct2.compareTo(ct1);
  76.                 }else{
  77. //                  System.out.println("调用id比较了");
  78.                     Integer id1=new Integer(sm1.getId()+"");
  79.                     Integer id2=new Integer(sm2.getId()+"");
  80.                     //升序降序通过id1和id2谁在前控制
  81.                     return id1.compareTo(id2);
  82.                 }
  83.                
  84.             }
  85.         };
  86.         //将属性值为null的时候就是根据实现的Comparator来进行比较了,此处可以查看commons-beanutils源代码确认
  87.         Comparator objCompare = new BeanComparator(null,ccc );
  88.         //这个默认的是升序
  89.         Collections.sort( smList, objCompare );
  90.         
  91.         return smList;
  92.     }
  93.     /**
  94.      * order by count desc,id asc方式的排序
  95.      * @author kongqz
  96.      * 此排序调用已有的jakarta的接口实现
  97.      * */
  98.     public List<SignMessage> sortMutiSM(List<SignMessage> smList){
  99.         //创建多属性排序链
  100.         ComparatorChain cc = new ComparatorChain();
  101.         //第一个参数是指定排序的属性,第二个参数指定降序升序
  102.         cc.addComparator(new BeanComparator("count"),true);
  103.         cc.addComparator(new BeanComparator("id"),false);
  104.         Collections.sort( smList, cc );
  105.         return smList;
  106.     }
  107.     
  108.     public static void main(String[] args){
  109.         CompareTest ct = new CompareTest();
  110.         
  111.         System.out.println("----------------单个javabean属性的排序-------------------------");
  112.         List<SignMessage> singleList = ct.initData();
  113.         List<SignMessage> singleTmpList=ct.orderSM(singleList);
  114.         System.out.println("-----------------javabean的单个属性排序,排序后-------------------");
  115.         for(SignMessage sm:singleTmpList){
  116.             System.out.println(sm.getName()+" ["+sm.getCount()+"]");
  117.         }
  118.         
  119.         
  120.         System.out.println("----------------重载接口进行多属性的排序-------------------------");
  121.         //初始化一个需要排序的集合
  122.         List<SignMessage> smList = ct.initData();
  123.         List<SignMessage> tmpList = ct.orderMutiSM(smList);
  124.         System.out.println("-------------------------直接实现多属性的排序,排序后------------");
  125.         for(SignMessage sm:tmpList){
  126.             System.out.println(sm.getName()+" ["+sm.getCount()+"]");
  127.         }
  128.         
  129.         System.out.println("----------------使用jakarta方法进行排序-------------------------");
  130.         //初始化一个需要排序的集合
  131.         List<SignMessage> sList = ct.initData();
  132.         //进行排序
  133.         List<SignMessage> tmpList1 = ct.sortMutiSM(sList);
  134.         System.out.println("-------------------------使用jakarta提供的排序chain进行排序,排序后------------");
  135.         for(SignMessage sm:tmpList1){
  136.             System.out.println(sm.getName()+" ["+sm.getCount()+"]");
  137.         }
  138.     }
  139. }

 

运行main函数,控制台看具体执行效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值