list对象排序通用方法

上传人:第*** 文档编号:31078679 上传时间:2018-02-04 格式:DOC 页数:6 大小:49KB
返回 下载 相关 举报
list对象排序通用方法_第1页
第1页 / 共6页
list对象排序通用方法_第2页
第2页 / 共6页
list对象排序通用方法_第3页
第3页 / 共6页
list对象排序通用方法_第4页
第4页 / 共6页
list对象排序通用方法_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《list对象排序通用方法》由会员分享,可在线阅读,更多相关《list对象排序通用方法(6页珍藏版)》请在金锄头文库上搜索。

1、List 对象排序通用方法在数据库中查出来的列表中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的 list 中排序,无疑会提高系统的性能。只要把第一次查出来的结果存放在 session 中,就可以对 list 重新排序了。一般对list 排序可以使用 Collections.sort(list),但如果 list 中包含是一个对象的话,这种方法还是行不通的。如果有下面这个对象:/UserInfo.javapackage test;import java.text.SimpleDateFormat;public clas

2、s UserInfo implements java.io.Serializableprivate java.lang.Integer userId;private java.lang.String username;private java.util.Date birthDate;private java.lang.Integer age;private SimpleDateFormat formater = new SimpleDateFormat(yyyy-MM-dd);public UserInfo()public UserInfo(java.lang.Integer userId,j

3、ava.lang.String username,java.util.Date birthDate,java.lang.Integer age)this.userId = userId;this.username = username;this.birthDate = birthDate;this.age = age;public void setUserId(java.lang.Integer value) this.userId = value;public java.lang.Integer getUserId() return this.userId;public void setUs

4、ername(java.lang.String value) this.username = value;public java.lang.String getUsername() return this.username;public void setBirthDate(java.util.Date value) this.birthDate = value;public java.util.Date getBirthDate() return this.birthDate;public void setBirthDatestr(String value) throws Exceptions

5、etBirthDate(formater.parse(value);public java.lang.String getBirthDatestr() return formater.format(getBirthDate();public void setAge(java.lang.Integer value) this.age = value;public java.lang.Integer getAge() return this.age;public String toString() return new StringBuffer().append(getUserId().appen

6、d(; +getUsername().append(; +getBirthDatestr().append(; +getAge().toString();这是一个简单的数据对象,现在要对 userId 排序,那么用上述的方法必须要用到如下所示类似的代码:Collections.sort(list, new Comparator() public int compare(Object a, Object b) int one = (Order)a).getUserId ();int two = (Order)b).getUserId (); return one- two ; ); 那么要实现对

7、 UserInfo 列表各字段排序,是不是每个字段都写一段如上所示的代码呢?那当然不是我们所需要的结果。写程序要写得越来越精练,不能越写越冗余。能不能写一个通用的方法呢?答案是肯定的,但首先必须能解决下面三个问题:1 可以使用泛型;2 能够使用通用的比较方法,比如 compareTo;3 有没有类似泛型、泛型方法那样的泛方法?第 1 个问题可以解决,第 2 个问题难度也不是很大,因为 Java 所有的类型都继承于Object,都有一个 ToString 的方法,暂且可以把所有类型转换成 String,然后用compareTo 作比较。第 3 个问题,日前还没有我们需要的泛方法。不过我们可以变通

8、一下,用 getMethod 和 invoke 动态的取出方法出来。完成代码如下:/SortList.javapackage test;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.lang.reflect.Method;import java.lang.reflect.InvocationTargetException;/* author jardot* version 1.0* 通用排序*/public class SortListpublic void

9、Sort(List list, final String method, final String sort)Collections.sort(list, new Comparator() public int compare(Object a, Object b) int ret = 0;try Method m1 = (E)a).getClass().getMethod(method, null);Method m2 = (E)b).getClass().getMethod(method, null);if(sort != null & desc.equals(sort)/倒序ret =

10、m2.invoke(E)b), null).toString().compareTo(m1.invoke(E)a), null).toString();else/正序ret = m1.invoke(E)a), null).toString().compareTo(m2.invoke(E)b), null).toString();catch(NoSuchMethodException ne)System.out.println(ne);catch(IllegalAccessException ie)System.out.println(ie);catch(InvocationTargetExce

11、ption it)System.out.println(it);return ret;);成功了!上面的代码没有用到具体的对象和类型,已经具有通用性了,我们用了一个泛型E,如果我们要对 UserInfo 的 userId 排序的话,可以把方法名用字符串的形式用参数传进去:例如“getUserId” 。可以使用下面的代码测试一下:/Test.javapackage test;import java.util.ArrayList;import java.util.List;import java.text.SimpleDateFormat;public class Test public stat

12、ic void main(String args)throws ExceptionList list = new ArrayList();SimpleDateFormat formater = new SimpleDateFormat(yyyy-MM-dd);list.add(new UserInfo(3,b,formater.parse(1980-12-01),11);list.add(new UserInfo(1,c,formater.parse(1980-10-01),30);list.add(new UserInfo(2,a,formater.parse(1973-10-01),11)

13、;System.out.println(-原来序列-);for(UserInfo user : list)System.out.println(user.toString();/调用排序通用类SortList sortList = new SortList();/按 userId 排序sortList.Sort(list, getUserId, desc);System.out.println(-按 userId 倒序-);for(UserInfo user : list)System.out.println(user.toString();/按 username 排序sortList.Sor

14、t(list, getUsername, null);System.out.println(-按 username 排序-);for(UserInfo user : list)System.out.println(user.toString();/按 birthDate 排序sortList.Sort(list, getBirthDatestr, null);System.out.println(-按 birthDate 排序-);for(UserInfo user : list)System.out.println(user.toString();运行结果如下:-原来序列-3; b; 198

15、0-12-01; 111; c; 1980-10-01; 302; a; 1973-10-01; 11-按userId倒序-3; b; 1980-12-01; 112; a; 1973-10-01; 111; c; 1980-10-01; 30-按username排序-2; a; 1973-10-01; 113; b; 1980-12-01; 111; c; 1980-10-01; 30-按birthDate 排序-2; a; 1973-10-01; 111; c; 1980-10-01; 303; b; 1980-12-01; 11注意:日期的排序是先通过格式转换的,再来排序的,否则将不能有正确的结果。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号