怎么对list里的对象按其属性排序
时间:2008-06-19 14:27:11
来源:论坛整理 作者: 编辑:chinaitzhe
网友回复:java.util.Collections
类中有个public static <T> void sort(List <T> list,Comparator <? super T> c)
方法用于集合的排序,Copmarator参数是比较器,学要自己实现。可以实现楼主想实现的功能。
网友回复:对象属性都未知,恐怕不好办啊。
只能够简单的用序列化了
网友回复:利用反射取出该属性的值,然后按照1楼说的排序
网友回复:http://blog.csdn.net/caoyinghui1986/archive/2008/03/30/2229937.aspx
参看这个吧。
网友回复:
俺想法和你一样
网友回复:class Comparatorsort implements Comparator{//实现Comparator接口
public int compare(Object o1,Object o2)
{
String str1=(String)o1;
String str2=(String)o2;
if(str1.compareTo(str2)>0) //比较对象按倒序定义
return -1;
if(str1.compareTo(str2) <0)
return 1;
return 0;
}
}
List list = new ArrayList();
list.add(Person p);
Collections.sort(list,new Comparatorsort());//排序
基本程序架构就是这样
网友回复:问题是现在属性未知,你怎么根据其属性决定怎么implements Comparator呢,不同类型如字符型,数字型等implements Comparator方法应该不一样吧
网友回复:恩。已经帮你实现了。不过需要你自己下载MVEL包。下载地址http://docs.codehaus.org/display/MVEL/Downloading MVEL。下载最新的2.0版本。
代码如下:
- Java code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.mvel.MVEL; public class MvelTest { public void persionSort(List<Persion> persions, final String sortName) { Collections.sort(persions, new Comparator(){ public int compare(Object o1, Object o2) { Persion persion1 = (Persion) o1; Persion persion2 = (Persion) o2; Object persion1result = MVEL.eval(sortName, persion1); Object persion2result = MVEL.eval(sortName, persion2); if(persion1result instanceof String) { return persion1result.toString().compareTo(persion2result.toString()); }else if(persion1result instanceof Integer) { return ((Integer)persion1result).intValue()-((Integer)persion2result).intValue(); }else { return persion1result.toString().compareTo(persion2result.toString()); } } }); } public static void main(String[] args) { MvelTest mvelTest = new MvelTest(); List<Persion> persions = new ArrayList<Persion>(); Persion xiaoming = new Persion(); xiaoming.setName("xiaoming"); xiaoming.setAge(12); xiaoming.setEmail("xiaoming@163.com"); Persion laowu = new Persion(); laowu.setName("laowu"); laowu.setAge(20); laowu.setEmail("laowu@163.com"); persions.add(xiaoming); persions.add(laowu); mvelTest.persionSort(persions, "name"); for(Persion persion : persions) { System.out.println(persion.getName() "\t" persion.getAge() "\t" persion.getEmail()); } mvelTest.persionSort(persions, "age"); for(Persion persion : persions) { System.out.println(persion.getName() "\t" persion.getAge() "\t" persion.getEmail()); } } }
运行结果:
laowu 20 laowu@163.com
xiaoming 12 xiaoming@163.com
xiaoming 12 xiaoming@163.com
laowu 20 laowu@163.com
网友回复:感觉用这个包太复杂了,感觉这个包的作用也就是从对象中把某个属性值取出,这个用反射先取得方法名就可以了,问题是反射返回来的方法返回值可能是基本数据类型,那怎么写Comparator呢,因为基本数据类型不能用instanceof的吧,也就是Comparator要分几种数据类型的情况呢
网友回复:就是个思路而已,你用反射完全没有问题。即便你用CGlib的动态代理也是可以的。
MVEL还是蛮有用的。我个人感觉你还是了解一下好。
关键字:list,对象,属性,排序,
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面