直接对List对象排序,提高系统性能

在数据库中查出来的列表中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的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

你可能感兴趣的:(list)