深圳市信任网站,企业网站模板 演示,在线生成器免费,深圳网站建设公司哪里有在数据库中查出来的列表list中#xff0c;往往需要对不同的字段重新排序#xff0c;一般的做法都是使用排序的字段#xff0c;重新到数据库中查询。如果不到数据库查询#xff0c;直接在第一次查出来的list中排序#xff0c;无疑会提高系统的性能。 只要把第一次查出来的结…在数据库中查出来的列表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 SortListE{ public void Sort(ListE 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{ListUserInfo list new ArrayListUserInfo();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());} //调用排序通用类SortListUserInfo sortList new SortListUserInfo();//按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