xieegai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
根据List对象的属性实现集合的自定义排序,我们主要有两种方式:
  一、比较对象实现Comparable接口,利用java.util.Collections.sort(List<T> list)方法实现自定义排序
  1.实体类(要比较的对象)
public class User implements Comparable<User>{
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(User o) {
        int compareTo = this.getName().compareTo(o.getName());
        return compareTo;  
    }
}

  2.测试类

public class Test {

    public static void main(String[] args) {
        User u1 = new User();
        u1.setId(1L);
        u1.setName("a");
        
        User u2 = new User();
        u2.setId(2L);
        u2.setName("bb");
        
        User u3 = new User();
        u3.setId(3L);
        u3.setName("ccc");
        
        List<User> list = new ArrayList<>();
        list.add(u2);
        list.add(u1);
        list.add(u3);
        
        for (User user : list) {
            System.out.println(user.getName());
        }
        System.out.println("*********************");
        
        // 升序
        Collections.sort(list);
        for (User user : list) {
            System.out.println(user.getName());
        }
        System.out.println("*********************");
        // 降序
        Collections.reverse(list);
        for (User user : list) {
            System.out.println(user.getName());
        }
    }
}

  3.运行结果

bb
a
ccc
*********************
a
bb
ccc
*********************
ccc
bb
a

  二、自定义比较器,实现Comparator接口,利用java.util.Collections.sort(List<T> list, Comparator<? super T> c)实现自定义排序

  1.实体类(要比较的对象,此时不用实现Comparable接口)

public class User{

    private Long id;
    
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

  2.测试类

public class Test {

    public static void main(String[] args) {
        User u1 = new User();
        u1.setId(1L);
        u1.setName("a");
        
        User u2 = new User();
        u2.setId(2L);
        u2.setName("bb");
        
        User u3 = new User();
        u3.setId(3L);
        u3.setName("ccc");
        
        List<User> list = new ArrayList<>();
        list.add(u2);
        list.add(u1);
        list.add(u3);
        
        for (User user : list) {
            System.out.println(user.getName());
        }
        
        Collections.sort(list, new Comparator<User>() {
            /*  
             * int compare(User o1, User o2) 返回一个基本类型的整型,  
             * 返回负数表示:o1小于o2  
             * 返回0 表示:o1和o2相等  
             * 返回正数表示:o1大于o2 
             */
            @Override
            public int compare(User o1, User o2) {
                if (o1.getId() < o2.getId()) {
                    return -1;
                }
                if (o1.getId() == o2.getId()) {
                    return 0;
                } 
                return 1;
            }
        });
        
        System.out.println("*********************");
        for (User user : list) {
            System.out.println(user.getName());
        }
    }
}

  3.运行结果

bb
a
ccc
*********************
a
bb
ccc

  4.测试案例是直接在测试类内部重写compare()方法的;其实还可以专门单独写一个比较器类,在测试类中调用即可。

 
posted on 2018-01-16 20:21  xieegai  阅读(2119)  评论(0编辑  收藏  举报