zoukankan      html  css  js  c++  java
  • 直接对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

  • 相关阅读:
    interpolator-动画执行方式
    获得手机屏幕的宽度
    theme-windowAnimationStyle 动画四个方法的意义
    viewPager-基本实现示例
    ontouch、dispatchtouchevent、interceptouchevent-相关事件
    eclipse- log 打印跟输出到文件
    item-设置可见性
    touch、touchevent-事件总结
    005-磁盘读写原理
    004-双向链表
  • 原文地址:https://www.cnblogs.com/chrischen662/p/1798276.html
Copyright © 2011-2022 走看看