怎么对list里的对象按其属性排序

时间:2008-06-19 14:27:11   来源:论坛整理  作者:  编辑:chinaitzhe
有列表List list,list存放对象(如Person p等),对象里面有若干属性,对象属性未知。怎么对列表按照列表对象的某个属性进行排序?


网友回复: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
参看这个吧。
网友回复:
引用 3 楼 phyeas 的回复:
利用反射取出该属性的值,然后按照1楼说的排序

俺想法和你一样
网友回复: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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面