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

    private java.lang.Integer userId;

    private java.lang.String username;

    private java.util.Date birthDate; 

    private java.lang.Integer age;

那么现在要对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 ;
}
});

这样,如果要实现对UserInfo列表各字段排序,是不是每个字段都写一段如上所示的代码呢?那当然不是我们所需要的结果。写程序要写得越来越精练,不能越写越冗余。能不能写一个通用的方法呢?答案是肯定的,但首先必须能解决下面三个问题:
1.  可以使用泛型;

2.  能够使用通用的比较方法,比如compareTo;

3.  有没有类似泛型、泛型方法那样的泛方法?

第1个问题可以解决,第2个问题难度也不是很大,因为Java所有的类型都继承于Object,都有一个ToString的方法,暂且可以把所有
类型转换成String,然后用compareTo作比较。第3个问题,日前还没有我们需要的泛方法。不过我们可否变通一下,使用getMethod和
invoke方法动态的取出方法出来。完成代码如下:

public class SortList<E>{
public void Sort(List<E> 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 = 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(InvocationTargetException it){
System.out.println(it);
}
return ret;
}
});
}
}

看看上面的代码,我们是不是成功地解决了上面三个问题,并且还加进了正倒序。代码中没有用到具体的对象和类型,已经具有通用性了,我们用了一个泛型E,如 果要对UserInfo的userId排序的话,可以把方法名用字符串的形式用参数传进去:例如“getUserId”。可以使用下面提供的代码测试一 下:

//Test.java
package test; import java.util.ArrayList;
import java.util.List;
import java.text.SimpleDateFormat; public class Test { public static void main(String[] args)throws Exception{
List<UserInfo> list = new ArrayList<UserInfo>(); 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)); System.out.println("-------原来序列-------------------");
for(UserInfo user : list){
System.out.println(user.toString());
} //调用排序通用类
SortList<UserInfo> sortList = new SortList<UserInfo>(); //按userId排序
sortList.Sort(list, "getUserId", "desc");
System.out.println("--------按userId倒序------------------");
for(UserInfo user : list){
System.out.println(user.toString());
} //按username排序
sortList.Sort(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; 1980-12-01; 11

1; c; 1980-10-01; 30

2; a; 1973-10-01; 11

--------按userId倒序------------------

3; b; 1980-12-01; 11

2; a; 1973-10-01; 11

1; c; 1980-10-01; 30

---------按username排序-----------------

2; a; 1973-10-01; 11

3; b; 1980-12-01; 11

1; c; 1980-10-01; 30

---------按birthDate排序-----------------

2; a; 1973-10-01; 11

1; c; 1980-10-01; 30

3; b; 1980-12-01; 11

注意:日期的排序是先通过格式转换再来排序的,否则将不能有正确的结果。

源内容:http://jardot.iteye.com/blog/762349

list对象排序的更多相关文章

  1. javascript数组对象排序

    javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...

  2. Java - 简单的对象排序 - Comparator

    注:对象排序,就是对对象中的某一字段进行比较,以正序或倒序进行排序. 例: 需要排序的对象: public class Person { public int age; public String n ...

  3. List对象排序的通用方法

    转自 @author chenchuang import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Me ...

  4. [个人原创]关于java中对象排序的一些探讨(三)

    这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...

  5. list排序成员函数对string对象与char*对象排序的差别

    对list容器中的对象排序,不能使用sort()算法,只能采用其自身的排序函数sort().因为,算法sort()只支持随机存取的容器的排序,如vector等. 对基本数据对象list排序:成员函数s ...

  6. Java集合中对象排序

    集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...

  7. js中的数组对象排序(方法sort()详细介绍)

    定义和用法 sort() 方法用于对数组的元素进行排序. 语法    arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意 ...

  8. python之attrgetter函数对对象排序

    # 使用attrgetter函数对对象排序 # attrgetter处理对象,itemgetter处理序列 from operator import attrgetter class user(): ...

  9. java对对象排序

    一.前言 有时我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现,一种方法是类实现Comparable<T>接口,然后调用Collections.so ...

  10. java 通用对象排序

    一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...

随机推荐

  1. SQL千万级数据设计和优化

    1. 数据太多.放在一个表肯定不行. 比如月周期表.一个月1000万,一年就1.2亿,如此累计下去肯定不行的.所以都是基于一个周期数据一个表.甚至一个周期数据就要分几个分表.主要是考虑实际的数据量而定 ...

  2. Lost connection to MySQL server at 'reading initial communication packet' 错误解决

    Lost connection to MySQL server at 'reading initial communication packet' 错误解决 上次解决了这个问题,今天又碰到,突然失忆, ...

  3. I.MX6 android 获取framebuffer信息

    /******************************************************************************** * I.MX6 android 获取 ...

  4. acdream 1684 娜娜梦游仙境系列——莫名其妙的插曲 (gcd)

    题意:一开始有一个集合,集合里有n个不同的数,然后Alice(娜娜)与Bob轮流进行操作,每人都可以任意选择两个数a,b,不妨设a>b,不过要求a-b不在集合中,把a-b放入集合(集合元素个数只 ...

  5. Java中的DeskTop类使用介绍

    在Jdk1.6以后新增加了一个类--DeskTop,在JDK中它的解释是这样的: The Desktop class allows a Java application to launch assoc ...

  6. wifi详解(二)

    1        Wifi模块解析和启动流程 1.1      框架分析 WIFI整体框架如图所示: 首先,用户程序使用WifiManager类来管理Wifi模块,它能够获得Wifi模块的状态,配置和 ...

  7. POJ 1423 Big Number

    题意:求n阶乘的位数. 解法:斯特林公式,,然后取log10就是位数了,因为精度问题需要化简这个式子,特判1. 代码: #include<stdio.h> #include<iost ...

  8. HDU 5429 Geometric Progression

    题意:给出一个大数数列,问是不是等比数列. 解法:拿java大数搞,注意全是0的情况也是Yes.我把公比用分数表示了,灰常麻烦,题解说只要判a[i - 1] * a[i + 1] == a[i] * ...

  9. Oracle :一次数据库连接,返回多个结果集

    1. 一次数据库连接,返回多个结果集 1.1 建立包规范 create or replace package QX_GDJTJ is -- Author : xxx -- Created : 2012 ...

  10. 学习笔记——XSLT转换器的使用(Xalan和Saxon) .(转)

    转自:http://blog.csdn.net/crystalbruce/article/details/7401602 XSLT分为两类: 1:客户端转换:需要浏览器的支持. 2:服务器转换:需要使 ...