关于泛型list中按照对象任意属性排序

来源:互联网 发布:网络主播实名认证 编辑:程序博客网 时间:2024/05/16 10:05

说明:适用ssh中通过bean的任意属性排序的情况案例。

正文:

排序是做web都会遇到的。这里有两种情况:一、一次性获得排序的list;二、多次获得list,多个list合并为一个,提供前台。

前者是简单的,hibernate已经支持通过传入排序的列名自动获得排序的数据,这里不再赘述。

后者比较麻烦,因为是多次查询后合并结果集,不能通过在查询时排序的策略,所以考虑写个通用的排序类对最后的list排序,再把排序的list生成JSONstring,提供给不同的模块使用。

思路:

采用泛型达到通用的目的,采用反射达到任意属性作为排序条件的目的。

code:

/**
* 自定义list排序
* @author lq
*
*/
class knowTypeComparator  implements java.util.Comparator<Object>{
public String sort;  //排序的列名
public String dir; //排序方法:ASC、DESC
public String beanname; //待排序的list内部对象的类全名,注意package带上
@SuppressWarnings("unchecked")
@Override
public int compare(Object arg0, Object arg1) {

try {
String sortMethod = "get"
+ sort.substring(0,1).toUpperCase()
+ sort.substring(1);
Class clazz = Class.forName(beanname);
java.lang.reflect.Method m1 = clazz.getMethod(
sortMethod, null);
Object ob0 = m1.invoke(arg0, null);
Object ob1 = m1.invoke(arg1, null);
String TypeStr = m1.getReturnType().toString();
int beg = m1.getReturnType().toString().lastIndexOf(".");
TypeStr = TypeStr.substring(beg + 1, TypeStr.length());
// System.out.println(ob0 + " || " + m1.getReturnType());

if("ASC".equals(dir)){
if(ob0 == null || ob1 ==null){
return ob0 == null ? -1 : 1;//保持null空在前
} else {
if("String".equals(TypeStr)){
return ((String)ob0).compareTo((String)ob1);
} else if("Long".equals(TypeStr)){
return ((Long)ob0).compareTo((Long)ob1);
} else if("Timestamp".equals(TypeStr)){
return ((Timestamp)ob0).compareTo((Timestamp)ob1);
} else if("Integer".equals(TypeStr)){
return ((Integer)ob0).compareTo((Integer)ob1);
} else {
return 0;//不排序,稳定性
}
}
} else {
if(ob0 == null || ob1 ==null){
return ob0 == null ? 1 : -1;
} else {
if("String".equals(TypeStr)){
return ((String)ob1).compareTo((String)ob0);
} else if("Long".equals(TypeStr)){
return ((Long)ob1).compareTo((Long)ob0);
} else if("Timestamp".equals(TypeStr)){
return ((Timestamp)ob1).compareTo((Timestamp)ob0);
} else if("Integer".equals(TypeStr)){
return ((Integer)ob1).compareTo((Integer)ob0);
} else {
return 0;//不排序,稳定性
}
}
}
} catch (Exception e) {
e.printStackTrace();
if (logger.isDebugEnabled()) {
logger.debug("getXXXX", e);
}
return 0;
}
}
}//end

使用方法举例:

以下代码放在前台调用action的某一方法中,该方法返回排序后的查询结果。

/**.....code*/

knowTypeComparator kc = new knowTypeComparator();
kc.dir = dir;//   Action中获得的参数dir
kc.sort = sort;//   Action中获得的参数sort
kc.beanname = UkKnowType.class.toString().substring(6);  // 自定义的类型,我的是对List<UkKnowType> childList  排序的
if(sort != null)
java.util.Collections.sort(childList,kc);   //List<UkKnowType> childList ,不同条件查询合并后的list

/**.....code*/


总结:

以上是自己摸索做的,相对比较粗糙,后期会做个方法直接调用,慢慢改善吧。

希望对你有帮助,感谢阅读。