有列表List list,list存放对象(如Person p等),对象里面有若干属性,对象属性未知。怎么对列表按照列表对象的某个属性进行排序?

解决方案 »

  1.   

    java.util.Collections
    类中有个public static <T> void sort(List<T> list,Comparator<? super T> c)
    方法用于集合的排序,Copmarator参数是比较器,学要自己实现。可以实现楼主想实现的功能。
      

  2.   

    http://blog.csdn.net/caoyinghui1986/archive/2008/03/30/2229937.aspx
    参看这个吧。
      

  3.   

    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());//排序
    基本程序架构就是这样
      

  4.   

    问题是现在属性未知,你怎么根据其属性决定怎么implements Comparator呢,不同类型如字符型,数字型等implements Comparator方法应该不一样吧
      

  5.   

    恩。已经帮你实现了。不过需要你自己下载MVEL包。下载地址http://docs.codehaus.org/display/MVEL/Downloading+MVEL。下载最新的2.0版本。
    代码如下: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("[email protected]");
    Persion laowu = new Persion();
    laowu.setName("laowu");
    laowu.setAge(20);
    laowu.setEmail("[email protected]");
    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 [email protected]
    xiaoming 12 [email protected]
    xiaoming 12 [email protected]
    laowu 20 [email protected]
      

  6.   

    感觉用这个包太复杂了,感觉这个包的作用也就是从对象中把某个属性值取出,这个用反射先取得方法名就可以了,问题是反射返回来的方法返回值可能是基本数据类型,那怎么写Comparator呢,因为基本数据类型不能用instanceof的吧,也就是Comparator要分几种数据类型的情况呢
      

  7.   

    就是个思路而已,你用反射完全没有问题。即便你用CGlib的动态代理也是可以的。
    MVEL还是蛮有用的。我个人感觉你还是了解一下好。