您的位置:首页 > 其它

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

2012-05-25 14:44 429 查看
说明:适用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*/

总结:

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

希望对你有帮助,感谢阅读。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: