关于泛型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*/
总结:
以上是自己摸索做的,相对比较粗糙,后期会做个方法直接调用,慢慢改善吧。
希望对你有帮助,感谢阅读。
正文:
排序是做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*/
总结:
以上是自己摸索做的,相对比较粗糙,后期会做个方法直接调用,慢慢改善吧。
希望对你有帮助,感谢阅读。
相关文章推荐
- java list按照 对象 指定多个字段属性进行排序
- C# List按照对象属性进行排序
- java list按照元素对象的指定多个字段属性进行排序
- 对list集合中的对象按照对象的某一属性进行排序
- C#中对List<Object>泛型集合,根据对象的某一属性进行升序排序
- LinkedList中将对象按照某一属性排序
- List集合对象中按照不同属性大小排序
- 对list集合中的对象按照字段属性排序
- LinkedList中将对象按照某一属性排序,利用 collection.sort(); 来进行调用!
- List中对象按照属性时间升序排序
- java list按照元素对象的指定多个字段属性进行排序
- java list按照元素对象的指定多个字段属性进行排序
- 按照list中对象的属性排序
- List集合按照对象中某个属性排序通用工具类(按对象中某属性排序)
- java list按照 对象 指定多个字段属性进行排序
- LinkedList中将对象按照某一属性排序
- java list按照元素对象的指定多个字段属性进行排序
- List<>能按照List中对象的某个属性排序吗
- java list按照元素对象的指定多个字段属性进行排序
- C#List<>能按照List中的对象某个属性排序