在数据库中查出来的列表中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能。既然有这个想法,那就动手试一试吧。

世上无难事,只怕有心人。

只要把第一次查出来的结果存放在session中,就可以对list重新排序了。一般对list排序可以使用Collections.sort(list),但如果list中包含是一个对象的话,这种方法还是行不通的。如果有下面这个对象:

 

//UserInfo.java

package project.model;



/**

*
@author chrischen

*/

public class UserInfo {

//columns START

private java.lang.Long userId;

private java.lang.String username;

private java.lang.String password;

private java.util.Date birthDate;

private Integer sex;

private java.lang.Integer age;

//columns END

public UserInfo(){

}



public void setUserId(java.lang.Long value) {

this.userId = value;

}



public java.lang.Long getUserId() {

return this.userId;

}



public java.lang.String getUsername() {

return this.username;

}



public void setUsername(java.lang.String value) {

this.username = value;

}



public java.lang.String getPassword() {

return this.password;

}



public void setPassword(java.lang.String value) {

this.password = value;

}

public java.util.Date getBirthDate() {

return this.birthDate;

}



public void setBirthDate(java.util.Date value) {

this.birthDate = value;

}



public Integer getSex() {

return this.sex;

}



public void setSex(Integer value) {

this.sex = value;

}



public java.lang.Integer getAge() {

return this.age;

}



public void setAge(java.lang.Integer value) {

this.age = value;

}



}

 

 

这是一个简单的数据对象,现在要对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.  能够使用通用的比较方法,比如比较字符串就不能使用“-”号了;

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

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

 

//SortList.java

package project.model;



import java.util.Collections;

import java.util.Comparator;

import java.util.List;

import java.lang.reflect.Method;

import java.lang.reflect.InvocationTargetException;



public class SortList<E>{



public void Sort(List<E> list, final String method){

//排序

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);

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 project.model;



import java.util.ArrayList;

import java.util.List;

import java.util.Iterator;

import java.text.SimpleDateFormat;

/**

*
@author chrischen

*/

public class Test {



public static void main(String[] args)throws Exception{

List
<UserInfo> list = new ArrayList<UserInfo>();



UserInfo userInfo
= new UserInfo();

SimpleDateFormat formater
= new SimpleDateFormat("yyyy-MM-dd");



userInfo.setUserId(
new Long(1));

userInfo.setUsername(
"b");

userInfo.setAge(
10);

userInfo.setBirthDate(formater.parse(
"1983-12-01"));

list.add(userInfo);



userInfo
= new UserInfo();

userInfo.setUserId(
new Long(3));

userInfo.setUsername(
"c");

userInfo.setAge(
30);

userInfo.setBirthDate(formater.parse(
"1980-12-01"));

list.add(userInfo);



userInfo
= new UserInfo();

userInfo.setUserId(
new Long(2));

userInfo.setUsername(
"a");

userInfo.setAge(
20);

userInfo.setBirthDate(formater.parse(
"1973-10-01"));

list.add(userInfo);



System.out.println(
"-------原来序列-------------------");

for(Iterator<UserInfo> it = list.iterator();it.hasNext();){

UserInfo user
= it.next();

System.out.println(user.getUserId()
+ ":"+user.getUsername()+":"+user.getAge()+":"+user.getBirthDate());

}



//调用排序通用类

SortList
<UserInfo> sortList = new SortList<UserInfo>();

//按userId排序

sortList.Sort(list,
"getUserId");

System.out.println(
"--------按userId排序------------------");

for(Iterator<UserInfo> it = list.iterator();it.hasNext();){

UserInfo user
= it.next();

System.out.println(user.getUserId()
+ ":"+user.getUsername()+":"+user.getAge()+":"+user.getBirthDate());

}



//按username排序

sortList.Sort(list,
"getUsername");

System.out.println(
"---------按username排序-----------------");

for(Iterator<UserInfo> it = list.iterator();it.hasNext();){

UserInfo user
= it.next();

System.out.println(user.getUserId()
+ ":"+user.getUsername()+":"+user.getAge()+":"+user.getBirthDate());

}



//按birthDate排序

sortList.Sort(list,
"getBirthDate");

System.out.println(
"---------按birthDate排序-----------------");

for(Iterator<UserInfo> it = list.iterator();it.hasNext();){

UserInfo user
= it.next();

System.out.println(user.getUserId()
+ ":"+user.getUsername()+":"+user.getAge()+":"+user.getBirthDate());

}

}



}

 

 

上面三个程序编译后,执行Test,结果如下:

 

-------原来序列-------------------

1:b:10:Thu Dec 01 00:00:00 CST 1983

3:c:30:Mon Dec 01 00:00:00 CST 1980

2:a:20:Mon Oct 01 00:00:00 CST 1973

--------按userId排序------------------

1:b:10:Thu Dec 01 00:00:00 CST 1983

2:a:20:Mon Oct 01 00:00:00 CST 1973

3:c:30:Mon Dec 01 00:00:00 CST 1980

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

2:a:20:Mon Oct 01 00:00:00 CST 1973

1:b:10:Thu Dec 01 00:00:00 CST 1983

3:c:30:Mon Dec 01 00:00:00 CST 1980

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

3:c:30:Mon Dec 01 00:00:00 CST 1980

2:a:20:Mon Oct 01 00:00:00 CST 1973

1:b:10:Thu Dec 01 00:00:00 CST 1983

 

 

看来离我们的目标已经很近很近了,不过有点小问题,上面的日期排序只是按星期排列,这显然不是我们要的结果。不过这应该是个小问题了

______________________________________

注:上述代码经过优化,完整代码可从下面地址下载:

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

posted on 2010-08-12 17:01  老 陈  阅读(5517)  评论(2编辑  收藏  举报