`
fengshujuan
  • 浏览: 160709 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
/**
	 * 	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" onclick="sort(this,1)"><bean:message key="cus.request.name"/><img id="1" style="display:none"/></TH>
	<TH id="2normal" onclick="sort(this,2)"><bean:message key="cus.request.process.name"/><img id="2" style="display:none"/></TH>
	<TH id="3normal" onclick="sort(this,3)"><bean:message key="cus.request.apptyp.name"/><img id="3" style="display:none"/></TH>
	<TH id="4normal" onclick="sort(this,4)"><bean:message key="cus.request.status"/><img id="4" style="display:none"/></TH>	
	<TH id="5normal" onclick="sort(this,5)"><bean:message key="cus.request.create.date"/><img id="5" style="display:none"/></TH>
	<TH id="6normal" onclick="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中,但是这个想法也是不可行的:同样如果有几十万条记录,而且同时有很多用户访问这个表单查询页面的话,后果也是不可预料的。

分享到:
评论

相关推荐

    java中set、list和map的使用方法实例

    // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该对象的内部细节。 // 学习set对象容器的使用 // set容器中的对象不允许重复 // set容器接口的实现类有HashSet和 ...

    基于python list对象中嵌套元组使用sort时的排序方法

    下面小编就为大家分享一篇基于python list对象中嵌套元组使用sort时的排序方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    java中的排序.ppt

    Comparable 接口中定义了 compareTo() 方法,用于提供对其实现类的对象进行整体排序所需要的比较逻辑。例如: ```java class Programmer implements Comparable { private String name; private String language;...

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    set.list.map接口

    3.Map(映射&lt;集合&gt;)是无序的,是一种把键对象和值对象进行映射的集合,它每一个元素都包含一对键对象和值对象,给出键对象就可以得到值对象,键对象不允许重复,对值没有要求,多个任意键对象可以映射到一个值对象...

    react-native-sortable-list:React Native可排序列表组件

    可排序列表视图,用于本机内容演示版安装npm i react-native-sortable-list --save例子API道具数据(对象)数据源订购? (数组)来自数据的键数组,来自数组的键顺序将用于初始行顺序风格? (对象,数组) ...

    java面试宝典

    56、写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔。 14 59、Java 编程,打印昨天的当前时刻。 15 60、java 和javasciprt 的区别。 15 61、什么时候用assert? 16 62、error和exception有什么...

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

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    java常用工具类的使用

    比如对一个数组进行排序,程序员可以写如下排序算法: 代码演示:数组排序 public static void sort(int[] arrs) { boolean isSwap = false; for (int i = 0; i ; i++) { isSwap = false; for (int j = arrs....

    python学生管理系统+报告(含文件操作,400+行,封装10余个函数)

    7.def notsort_excel()和def sort_excel():对学生的绩点进行升序或者降序排序。 8.def change_student():将学生信息进行修改。 9.def main_top():创建主窗口界面并对其进行设置等操作。 10.def creat_excel(stu: ...

    Python实现按学生年龄排序的实际问题详解

    问题:定义一个Class:包含姓名name、性别gender、年龄age,需要按年龄给学生排序。 输入:包含学生对象的List。 输出:按照年龄age进行排序好的List。 思路1:使用冒泡排序,比较相邻的学生,如果第一个学生的age...

    java 面试题 总结

    在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...

    基于python的TXT解析器 parser 包含各个版本的代码 见注释

    并将同一组合中的数字合为一个元素(在同一循环,用这个数字的元素作为一个dict的索引),用dict自带的setdefault()进行Key的添加顺便设置Key的值为list,避免Key重复,在用append把当前Key的字符串,添加到Key对应...

    flex3的cookbook书籍完整版dpf(包含目录)

    对一个XMLList或E4X查询进行绑定 19.6节. 从数组中生成XML对象 19.7节. 如何处理XML服务里所返回的命名空间 19.8节. 将ActionScript 数据对象编码成XML 19.9节. 使用复杂XML数据来填充组件 19.10节. 从Web服务中把...

    习----题-Java-Web程序设计教程-[共2页].pdf

    在 Java EE 中对数据 进行存储时都可以考虑集合。但要依据存储要求不同(如读优先还是写优先)选择适合的集合类 型。此外,本章还介绍了 Java 泛型编程。限于篇幅,我们没有详细研究泛型编程技术。如果要深 入了解...

    PB扩展组件

    Tcontrol 单一容器对象,可容纳一个可视化对象或Fir可视对象,将容纳的对象的大小设置与自己一样。 TSpliterBar 多风格分隔条对象 TDataWindow DataWindow的替代对象。自动排序,统一风格等等,自动处理多选问题。...

    C#学习笔记_20100614

    在 C#中遍历和排序对象集合 StringWriter实现的一个功能 创建一个文本文件并写入文本 序列化对象到文件 创建一个文本文件并写入文本 文件夹拷贝 使用C#解析简单XML 读 XML文件 用 XmlWriter写 XML文件 插入数据到 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    一个对象的生命期包括三个阶段:创建对象、对象的引用和释放对 象 。 1.8.3 创建对象 创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例...

    collecter集合总结

    集合总结 ...* 如果需要存储无顺序的元素,选择 Set 集合,首先选择 HashSet,如果需要对元素进行排序,可以选择 TreeSet。 集合是 Java 中一个非常重要的概念,选择合适的集合可以提高程序的效率和性能。

    Java集合框架的一个扑克牌小程序

    * Game 类 * 功能:整个游戏:开始游戏 -&gt; 初始牌 -&gt; 洗牌 -&gt; 发牌 -&gt; 排序 -&gt; 比较... * 功能:产生一个角色 * 属性:ID、Name、和、存储牌的List集合。 * 方法: public People() //初始化存储牌的List集合; *

Global site tag (gtag.js) - Google Analytics