(好使)用Java集合中的Collections.sort方法对list排序的两种方法

时间:2022-01-30 19:36:45
用Collections.sort方法对list排序有两种方法

第一种是list中的对象实现Comparable接口,如下:

/**
* 根据order对User排序
*/
public class User implements Comparable<user>{
    private String name;
    private Integer order;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
    public int compareTo(User arg0) {
        return this.getOrder().compareTo(arg0.getOrder());
    }

}
     
测试一下: 

public class Test{

    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("a");
        user1.setOrder(1);
        User user2 = new User();
        user2.setName("b");
        user2.setOrder(2);
        List <user>  list = new ArrayList<user>();
        //此处add user2再add user1
        list.add(user2);
        list.add(user1);
        Collections.sort(list);
        for(User u : list){
            System.out.println(u.getName());
        }
    }
}
输出结果如下 
a
b
 
第二种方法是根据Collections.sort重载方法来实现,例如: 

/**
* 根据order对User排序
*/
public class User { //此处无需实现Comparable接口
    private String name;
    private Integer order;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getOrder() {
        return order;
    }
    public void setOrder(Integer order) {
        this.order = order;
    }
}

主类中这样写即可: 

public class Test{
    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("a");
        user1.setOrder(1);
        User user2 = new User();
        user2.setName("b");
        user2.setOrder(2);
        List<user> list = new ArrayList<user> ();
        list.add(user2);
        list.add(user1);
        
        Collections.sort(list,new Comparator<user>(){
            public int compare(User arg0, User arg1) {
                return arg0.getOrder().compareTo(arg1.getOrder());
            }
        });

        for(User u : list){
            System.out.println(u.getName());
        }
    }
}
输出结果如下 
a
b
 
前者代码结构简单,但是只能根据固定的属性排序,后者灵活,可以临时指定排序项,但是代码不够简洁 

多字段的场合: 

Collections.sort(list,new Comparator<user>(){
            public int compare(User arg0, User arg1) {
 //            第一次比较专业
                int i = arg0.getOrder().compareTo(arg1.getOrder());

//            如果专业相同则进行第二次比较
            if(i==0){
//                第二次比较
                int j=arg0.getXXX().compareTo(arg1.getXXX());
//                如果学制相同则返回按年龄排序
                if(j==0){
                    return arg0.getCCC().compareTo(arg1.getCCC());
                }
                return j;
            }
            return i;
            }
        });

============================================

另可参考:http://gwh-08.iteye.com/blog/1233401

===========================================

在java web开发中,我们有时会遇到这种情况:从数据库中查询出一串数据,把它们放入了List里面 然后在前端页面上显示出来,现在我要在页面上控制它们排序,比如一个下拉框,选择了日期,把查出来的数据进行排序,对于这样的排序要求,我们可以写通用的排序方法。

具体代码如下:

排序算法:

//利用 Collections.sort排序

public void sort(List<E> list,final String method,final String sort){  
    Collections.sort(list,new Comparator(){
    public int compare(Object a,Object b){
    int ret = 0;
    try{
     Method m1 = ((E)a).getClass().getMethod(method, null);
     Method m2 = ((E)b).getClass().getMethod(method, null);
     if("desc".equals(sort)&&sort!=null){

     //因为这个方法是按照字符串去排序的,所对针对于数字排序,思路为:将数字也当成字符串,先去比较长度,若长度一样,就比较字符串大小

       ret = String.valueOf(m2.invoke(((E)b), null).toString().length()).compareTo(String.valueOf(m1.invoke(((E)a), null).toString().length()));
         if(m2.invoke(((E)b), null).toString().length()==m1.invoke(((E)a), null).toString().length()){
           ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a), null).toString());
         }
      }else{
       ret = String.valueOf((m1.invoke(((E)a), null).toString().length())).compareTo(String.valueOf(m2.invoke(((E)b), null).toString().length()));
     }
     }catch(NoSuchMethodException e){
      e.printStackTrace();
     } catch (IllegalArgumentException e) {
      e.printStackTrace();
     } catch (IllegalAccessException e) {
      e.printStackTrace();
     } catch (InvocationTargetException e) {
      e.printStackTrace();
     }
     return ret;
    }
   }

);
 }

在具本list中调用:

SortList<Communication> ls = new SortList<Communication>();
ls.sort(list1, "getRatio", "desc");

其中:list1是从数据库中所查询出来的,getRatio指的是排序列的get方法,desc是指降序排列