对一个list中包含对象的 list 进行排序

/**
	 * 	1 request.name; 2 process.name 3 apptype.name
	 *  4 request.status 5 request.date 6 request.creater
	 * @return
	 */
	public List<CusRequest> sortList(List<CusRequest> crqList,int colIndex,String order){
		 Comparator cmp1 = new CusRequestCompare(colIndex,order);  
		 Collections.sort(crqList, cmp1);
		 return crqList;
	 }
	 
	class CusRequestCompare implements Comparator {
		int index=0;
		String order = "desc";
		CusRequestCompare(int i,String orderf ){
			index = i;
			order = orderf;
		}
		public int compare(Object o1, Object o2) { 
			CusRequest r1=(CusRequest)o1;
			CusRequest r2=(CusRequest)o2;
			String c1="";
			String c2="";
			long d1 = 0;
			long d2 = 0;
			switch(index){
			case 1:
				c1= r1.getName();
				c2 = r2.getName();
				break;
			case 2:
				c1 = r1.getProcess().getName();
				c2 = r2.getProcess().getName();
				break;
			case 3:
				c1 = r1.getAppType().getDescription();
				c2 = r2.getAppType().getDescription();
				break;
			case 4:
				c1 = UtilLocaleMessage.getLocaleMessage("rm.PROCESS");
				if(r1.getFinalState()!=null){
					c1 = r1.getFinalState().toString();
				}
				c2 = UtilLocaleMessage.getLocaleMessage("rm.PROCESS");
				if(r2.getFinalState()!=null){
					c2 = r2.getFinalState().toString();
				}
				break;
			case 5:
				d1 = r1.getApplyDate().getTime();
				d2 = r2.getApplyDate().getTime();
				break;
			case 6:
				c1 = r1.getApplicant().getEmpName();
				c2 = r2.getApplicant().getEmpName();
				break;
			}
			Collator myCollator = Collator.getInstance(java.util.Locale.CHINA);  
			if(c1.equals("")){
				if ((d1-d2) < 0) {
					if(order.equals("desc")){
						return -1;  
					}else{
						return 1;
					}
				}else if ((d1-d2) > 0){  
					if(order.equals("desc")){
						return 1;  
					}else{
						return -1;
					}
				}else{  
					return 0;
				}
			}else{
				if (myCollator.compare(c1,c2) < 0) {
					if(order.equals("desc")){
						return -1;  
					}else{
						return 1;
					}
				}else if (myCollator.compare(c1,c2) > 0){  
					if(order.equals("desc")){
						return 1;  
					}else{
						return -1;
					}
				}else{  
					return 0;
				}
			}
			
		}//override compare
	}//class CusRequestCompare

 其中,list是要排序的对象;

这个list是现实在一个table中的,可以按照表头进行排序,我这里用了表头所在的列colIndex,进行标示对哪一列进行排序,ord是排序的顺序。

对应的页面jsp为

<thead>

  <TR>

    <TH id="1normal" οnclick="sort(this,1)"><bean:message key="cus.request.name"/><img id="1" style="display:none"/></TH>
	<TH id="2normal" οnclick="sort(this,2)"><bean:message key="cus.request.process.name"/><img id="2" style="display:none"/></TH>
	<TH id="3normal" οnclick="sort(this,3)"><bean:message key="cus.request.apptyp.name"/><img id="3" style="display:none"/></TH>
	<TH id="4normal" οnclick="sort(this,4)"><bean:message key="cus.request.status"/><img id="4" style="display:none"/></TH>	
	<TH id="5normal" οnclick="sort(this,5)"><bean:message key="cus.request.create.date"/><img id="5" style="display:none"/></TH>
	<TH id="6normal" οnclick="sort(this,6)"><bean:message key="cus.request.creater"/><img id="6" style="display:none"/></TH>
	<TH><bean:message key="cus.request.history"/></TH>
  </TR>

 onclik 对应的js脚本为

function sort(obj,index){
	document.getElementById("colIndex").value = index;
	var order = obj.id;
	if(order.indexOf("normal")>-1){
		document.getElementById("order").value = "desc";
		obj.id = index+"desc";
	}else if(order.indexOf("desc")>-1){
		document.getElementById("order").value="asc";
		obj.id = index+"asc";
	}else if(order.indexOf("asc")>-1){
		document.getElementById("order").value="desc";
		obj.id = index+"desc";
	}
	setSubmitValues();
	document.getElementById("sform").submit();
	
}

 其中,colIndex和order是hidden变量,以方便每次form提交的时候,从jsp页面获取colIndex和order的值。

 

每次排序其实都请求了一次服务器端,进行了表单的一次提交。这样的效率的确很慢,非常不如用js脚本在客户端分页。但是在客户端分页却有一个致命的缺点:如果list中包含的数据非常庞大,比如十几万条,一下子把这些数据传到一个jsp页面是一件非常耗时的工作,而且恐怕也是不能实现的(这个我从来没有验证过,不知道这个传输的数据量有没有限制)

所以宁可每次都慢一点点,也不能让这种可怕的事情发生。

还有一个,就是我曾想过把list中的数据缓存在session中,但是这个想法也是不可行的:同样如果有几十万条记录,而且同时有很多用户访问这个表单查询页面的话,后果也是不可预料的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值