对某一个List
对某一个List<Object> 对象进行按多属性条件排序
今天有个同事问我 怎么对一个List<Object> 对象进行动态多条件排序。
由于他比较急用 所以先只对它的具体某个Object 对象进行排序 他的这个Object 就是从其它几个相关实体 获取所需要的属性组成的一个pOJObean
用了差不多一个小时 整理一个思路 并写了下来; (当然存在一些问题)
我先说说我的思路: 就是利用java的反射机制 来获取属性后 再比较
(如果朋友们有其它方法请留言分享,有帮改进 也请留言,谢谢先:)
————————————————————————————————————————
/**
* 利用反射机制多条件排序
* 主要是针对字串排序
* 注 字串首字母大写
*@param list
* @param pros TestA的属性
* @return
*/
private void getSortedList(List<TestA> list,String[] pros)
{
if(pros.length<=0)
return ;
for(int i=pros.length-1;i>=0;i--){
final String pro=pros[i];
try {
Collections.sort(list, new Comparator<TestA>() {
String name = "get" + pro;
Method method = TestA.class.getMethod(name,
new Class[] {});
public int compare(TestA a, TestA b) {
if (a == null || b == null) {
return 0;
} else {
int flag=0;
try {
Object as = method.invoke(a, new Object[] {});
Object bs = method.invoke(b, new Object[] {});
if(as==null&&bs==null)
return 0;
else if(as==null)
return -1;
else if(bs==null)
return 1;
else{
if(as instanceof String ){
String va=(String)as;
String vb=(String)bs;
flag= va.compareTo(vb);
}
if(as instanceof Date){
Date va=(Date)as;
Date vb=(Date)bs;
if(va.before(vb))
return -1;
else
return 1;
}
}
} catch (IllegalArgumentException e) {
System.out.println("e1");
} catch (IllegalAccessException e) {
System.out.println("e2");
} catch (InvocationTargetException e) {
System.out.println("e3");
}
return flag;
}
}
});
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
——————————————————————————————————————
呵呵 ,做起测试了一二次 OK,就让他交差了,应该还存在一些问题哈
目前问题:1. 如果 某一个比较属性对应的值为NULL, 这里的比较应该还要改善;
2. 现在只做了对字串和时间比较,
3. 还没有扩展,只针对 TestA 这个bean List 应该可以改为Object 或泛类
4.传的参 必须为 存在的属性 且每个参首字大写 没有做异常处理 呵呵
------先记录在这儿 。。。。
今天有个同事问我 怎么对一个List<Object> 对象进行动态多条件排序。
由于他比较急用 所以先只对它的具体某个Object 对象进行排序 他的这个Object 就是从其它几个相关实体 获取所需要的属性组成的一个pOJObean
用了差不多一个小时 整理一个思路 并写了下来; (当然存在一些问题)
我先说说我的思路: 就是利用java的反射机制 来获取属性后 再比较
(如果朋友们有其它方法请留言分享,有帮改进 也请留言,谢谢先:)
————————————————————————————————————————
/**
* 利用反射机制多条件排序
* 主要是针对字串排序
* 注 字串首字母大写
*@param list
* @param pros TestA的属性
* @return
*/
private void getSortedList(List<TestA> list,String[] pros)
{
if(pros.length<=0)
return ;
for(int i=pros.length-1;i>=0;i--){
final String pro=pros[i];
try {
Collections.sort(list, new Comparator<TestA>() {
String name = "get" + pro;
Method method = TestA.class.getMethod(name,
new Class[] {});
public int compare(TestA a, TestA b) {
if (a == null || b == null) {
return 0;
} else {
int flag=0;
try {
Object as = method.invoke(a, new Object[] {});
Object bs = method.invoke(b, new Object[] {});
if(as==null&&bs==null)
return 0;
else if(as==null)
return -1;
else if(bs==null)
return 1;
else{
if(as instanceof String ){
String va=(String)as;
String vb=(String)bs;
flag= va.compareTo(vb);
}
if(as instanceof Date){
Date va=(Date)as;
Date vb=(Date)bs;
if(va.before(vb))
return -1;
else
return 1;
}
}
} catch (IllegalArgumentException e) {
System.out.println("e1");
} catch (IllegalAccessException e) {
System.out.println("e2");
} catch (InvocationTargetException e) {
System.out.println("e3");
}
return flag;
}
}
});
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
——————————————————————————————————————
呵呵 ,做起测试了一二次 OK,就让他交差了,应该还存在一些问题哈
目前问题:1. 如果 某一个比较属性对应的值为NULL, 这里的比较应该还要改善;
2. 现在只做了对字串和时间比较,
3. 还没有扩展,只针对 TestA 这个bean List 应该可以改为Object 或泛类
4.传的参 必须为 存在的属性 且每个参首字大写 没有做异常处理 呵呵
------先记录在这儿 。。。。