`
uule
  • 浏览: 6352654 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

按对象中某一属性排序

阅读更多

1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。
2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

用自定义类实现 Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的实例邦定。

而Comparator比较灵活,它没有和任何类绑定,实现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类可以分别和多个实现 Comparator接口的类绑定,从而达到可以按自己的意愿实现按多种方式排序的目的。Comparable——“静态绑定排序”,Comparator——“动态绑定排序”。

 

排序:

 Collections.sort(lists, new comparator(){                         

int compare(Object o1, Object o2) {     
        Member m1=(Member)o1;
        Member m2=(Member)o2;        
        // 按姓名排序
        return m1.getName().compareTo(m2.getName();
   }   
});  

 根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数

 

属性为String型:(动态加载对象属性的get方法)

 

   1. public class SortList<E>{   
   2.     public void Sort(List<E> list, final String method, final String sort){  
   3.         Collections.sort(list, new Comparator() {             
   4.             public int compare(Object a, Object b) {  
   5.                 int ret = 0;  
   6.                 try{  
   7.                     Method m1 = ((E)a).getClass().getMethod(method, null);  
   8.                     Method m2 = ((E)b).getClass().getMethod(method, null);  
   9.                     if(sort != null && "desc".equals(sort))//倒序  
  10.                         ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a), null).toString());   
  11.                     else//正序  
  12.                         ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());  
  13.                 }catch(NoSuchMethodException ne){  
  14.                     System.out.println(ne);  
  15.                 }catch(IllegalAccessException ie){  
  16.                     System.out.println(ie);  
  17.                 }catch(InvocationTargetException it){  
  18.                     System.out.println(it);  
  19.                 }  
  20.                 return ret;  
  21.             }  
  22.          });  
  23.     }  
  24. }  
 

  m1:

 

public java.lang.Integer com.openb2c.openreport.DayReport.getOrderSize()

完整连接:

1.http://wenku.baidu.com/view/a19a50ea81c758f5f61f674a.html

2.http://jardot.iteye.com/blog/762349

 

 

DayReport.java类:

public class DayReport extends BaseReport{

	private String date;
	private Double totalFee;
	private Double refundFee;
	private Double getMoney;
	private Double postFee;
	private Integer orderSize;	
	
	private Long productNum;  //产品数,即符合条件的订单中有多少个产品
	private Integer backProductNum; //退款通过的订单中产品的个数
	private Integer backOrderNum;  //退款通过的订单个数
	
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public Double getTotalFee() {
		return totalFee;
	}
	public void setTotalFee(Double totalFee) {
		this.totalFee = totalFee;
	}
	public Double getRefundFee() {
		return refundFee;
	}
	public void setRefundFee(Double refundFee) {
		this.refundFee = refundFee;
	}
	public Double getGetMoney() {
		return getMoney;
	}
	public void setGetMoney(Double getMoney) {
		this.getMoney = getMoney;
	}
	public Double getPostFee() {
		return postFee;
	}
	public void setPostFee(Double postFee) {
		this.postFee = postFee;
	}
	public Integer getOrderSize() {
		return orderSize;
	}
	public void setOrderSize(Integer orderSize) {
		this.orderSize = orderSize;
	}
	
	public Long getProductNum() {
		return productNum;
	}
	public void setProductNum(Long productNum) {
		this.productNum = productNum;
	}
	public Integer getBackProductNum() {
		return backProductNum;
	}
	public void setBackProductNum(Integer backProductNum) {
		this.backProductNum = backProductNum;
	}
	public Integer getBackOrderNum() {
		return backOrderNum;
	}
	public void setBackOrderNum(Integer backOrderNum) {
		this.backOrderNum = backOrderNum;
	}
}
 

 

1、对Double型数据排序(通用方法):

/**
     * 给Double型排序
     * method 为DayReport中属性的 get方法名如:getOrderSize
     * sort 为排序
     *check 为选择的条件如1天内、1月内等
     */
	@SuppressWarnings("unchecked")
	public static  void SortDouble (List<DayReport> list,final String method,final String sort){		
		
		Comparator comparator = new Comparator(){
			public int compare(Object a, Object b) {	
				int ret = 0;  
				try {
					 Method m1 = ((DayReport)a).getClass().getMethod(method, null);
					 Method m2 = ((DayReport)b).getClass().getMethod(method, null);
					 double m=(Double) m1.invoke((DayReport)a);
					 double n=(Double) m2.invoke((DayReport)b);
					 double c=m-n;
					
						if(c>0.0)//倒序  							
						{
							if(sort.equals("DESC")){
								ret=-1;  //本来
							}else{
								ret=1;
							}						
						}
						else if(c<0.0){
							if(sort.equals("DESC")){
								ret=1;
							}else{
								ret=-1;
							}	
						}else{
							ret=0;
						}						
				} catch (SecurityException e) {
					StringBuilder msg = new StringBuilder("Double类型数据排序时出现异常!");
					Debug.logError(e,msg.toString(), module);
				} catch (NoSuchMethodException e) {
					StringBuilder msg = new StringBuilder("Double类型数据排序时出现异常!");
					Debug.logError(e,msg.toString(), module);
				} catch (IllegalAccessException e) {
					StringBuilder msg = new StringBuilder("Double类型数据排序时出现异常!");
					Debug.logError(e,msg.toString(), module);
				} catch (InvocationTargetException e) {
					StringBuilder msg = new StringBuilder("Double类型数据排序时出现异常!");
					Debug.logError(e,msg.toString(), module);
				}  
				return ret;
			}			
		};
		Collections.sort(list,comparator);
	}

 2.对Int型排序(通用方法)

/**
     * 给int型排序
     */
	@SuppressWarnings("unchecked")
	public static  void SortInt (List<DayReport> list,final String method,final String sort){	
		
		/*Comparator comparator = new Comparator(){
			public int compare(Object a, Object b) {
				Integer aa = ((DayReport) a).getOrderSize();
				Integer bb = ((DayReport) b).getOrderSize();
				Integer cc = aa - bb;
				if (cc > 0)
					return 1;
				if (cc < 0)
					return -1;
				else
					return 0;
			}
		};
		Collections.sort(list,comparator);
	}*/
		Comparator comparator = new Comparator() {
			public int compare(Object a, Object b) {
				int ret = 0;
			
					Method m1 = ((DayReport) a).getClass().getMethod(method,
							null);
					Method m2 = ((DayReport) b).getClass().getMethod(method,
							null);
					Integer m = (Integer) m1.invoke((DayReport) a);
					Integer n = (Integer) m2.invoke((DayReport) b);
					Integer c = m - n;

					if (c > 0)// 倒序
					{
						if (sort.equals("DESC")) {
							ret = -1; // 本来
						} else {
							ret = 1;
						}
					} else if (c < 0) {
						if (sort.equals("DESC")) {
							ret = 1;
						} else {
							ret = -1;
						}
					} else {
						ret = 0;
					}
				
				return ret;
			}
		};
		Collections.sort(list, comparator);
	}

 

使用:

 

<th><a href="<@ofbizUrl>queryDay?check=${check?if_exists}&method=getTotalFee&sort=${orderby?if_exists}</@ofbizUrl>">销售额</a></th>
          <th><a href="<@ofbizUrl>queryDay?check=${check?if_exists}&method=getRefundFee&sort=${orderby?if_exists}</@ofbizUrl>">退款额</a></th>
 

 

String method=(String)context.get("method");
        String  sort=(String)context.get("sort");
        if(UtilValidate.isEmpty(sort)){        		
    		sort="ASC";
    	}else{
			if (UtilValidate.areEqual(sort, "ASC")) {
				sort = "DESC";
			} else {
				sort = "ASC";
			}
    	}
        
        if(UtilValidate.isNotEmpty(method)){  
        	if(method.equals("getOrderSize")){
        		DayReportService.SortInt(finallyList,method,sort);
        	}else{
        		DayReportService.SortDouble(finallyList,method,sort);
        	}
        }  
		result.put("finallyList", finallyList);	
		result.put("sort", sort);
		result.put("check", check);
分享到:
评论
1 楼 mm4409092 2013-11-07  
Java通用工具类之按对象属性排序工具类
http://blog.csdn.net/lk_blog/article/details/12804873

相关推荐

    List中保存对象,按对象中某一属性排序【含程序源码】

    这篇博客“List中保存对象,按对象中某一属性排序【含程序源码】”恰好提供了这样的解决方案。下面我们将深入探讨这个主题。 首先,让我们理解列表(List)和对象排序的基本概念。列表是Java集合框架的一部分,它允许...

    List集合按照对象中某个属性排序通用工具类(按对象中某属性排序)

    在开发中,我们可能会遇到,我们会根据不同情况对一个List集合进行排序操作,为了方便List集合根据对象中的某一个属性进行排序,开发了此工具类:

    JS实现根据数组对象的某一属性排序操作示例

    然后定义了一个名为`compare`的函数,这个函数接收一个参数`property`,它是字符串类型,代表对象中需要根据其值进行排序的属性名。 `compare`函数返回一个新的函数,这个返回的函数才是实际的比较函数。在`compare...

    js对象数组按属性快速排序

    按所推荐的程序在IE下跑了下,的确,排序耗时很小。 代码如下: [removed] /* * 洗牌 */ function ... /* * 快速排序,按某个属性,或按“获取排序依据的函数”,来排序. * @method soryBy * @static * @

    (时间)排序函数、按某一属性排序

    本文将深入探讨时间排序函数以及如何按照对象数组中的特定属性进行排序。 首先,我们来理解“时间排序函数”。这个函数的主要目标是根据时间值对一组数据进行排序。在计算机科学中,时间通常表示为日期和时间戳,...

    python实现对象列表根据某个属性排序的方法详解

    在例子中,我们使用了一个`lambda`表达式`lambda x: x.salary`作为`key`,表示按照Person对象的`salary`属性进行排序。如果想要降序排序,只需将`reverse`参数设为`True`。 ```python obj_list.sort(key=lambda x: ...

    Java实现储存对象并按对象某属性排序的几种方法示例

    在Java编程中,储存对象并按对象的某个属性进行排序是一项常见的需求。下面将详细介绍三种在Java中实现这一目标的方法,以及如何使用这些方法来优化排序过程。 **第一种方法:使用`TreeSet`** `TreeSet`是Java集合...

    Java对集合中的对象排序

    对集合中的对象进行排序,例如:List中存放了User对象,则可根据User对象的某一个属性进行顺序or倒序的排序

    js 根据对象数组中的属性进行排序实现代码

    在JavaScript中,处理数据时经常需要对数组进行排序,特别是当数组包含对象时,我们可能需要根据对象的某个属性来排序。本文将深入探讨如何使用JavaScript实现这一功能。 首先,JavaScript的`Array.prototype.sort...

    Android List(集合)中的对象以某一个字段排序案例

    Android List(集合)中的对象以某一个字段排序案例 Android List(集合)中的对象以某一个字段排序案例是 Android 开发中非常重要的一部分。在实际开发中,我们经常需要对一个对象的集合按照某一个字段进行排序,例如...

    JS实现json对象数组按对象属性排序操作示例

    本文实例讲述了JS实现json对象数组按对象属性排序操作。分享给大家供大家参考,具体如下: 在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序。 例如...

    java8新特性将List中按指定属性排序过滤重复数据的方法

    Java 8 新特性将 List 中按指定属性排序过滤重复...总结来说,Java 8 新特性将 List 中按指定属性排序过滤重复数据的方法是一个非常有用的功能,它可以帮助开发者快速地对数据进行排序和过滤,满足实际应用中的需求。

    java list集合排序按某一属性排序操作

    Java List 集合排序按某一属性排序操作 Java 集合框架中提供了多种排序方法,今天我们将介绍如何对 Java List 集合进行排序,特别是按照某一属性进行排序操作。 Java List 集合排序 Java 的 List 集合提供了多种...

    集合对象排序

    在编程领域,集合对象排序是一项基础且重要的任务,它涉及到数据结构和算法的知识。当我们处理包含多个元素的数据集,如数组、列表或集合时,排序能够帮助我们快速查找、分析和展示信息。本文将深入探讨如何对对象...

Global site tag (gtag.js) - Google Analytics