java自定义排序(Comparable与Comparator)

来源:互联网 发布:淘宝店铺页头怎么换 编辑:程序博客网 时间:2024/05/12 03:26
import java.util.*;/** * @author 曹帅 E-mail:cslvln@foxmail.com * @version 创建时间:2017/9/11 下午2:08 */public class User implements Comparable<User>{    private String name;    private int age;    public User() {    }    public User(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "User{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public int compareTo(User o) {        int i = o.age - age;        if(i == 0){            return o.name.compareTo(name);        }        return i;    }    public static void main(String[] args) {        User user1 = new User("Jackie", 25);        User user2 = new User("Jim", 18);        User user3 = new User("Lucy", 30);        User user4 = new User("Kate", 18);        List<User> users = new ArrayList<User>();        users.add(user1);        users.add(user2);        users.add(user3);        users.add(user4);        System.out.println("排序前" );        for (User user : users) {            System.out.println(user.getName() + " " + user);        }        /**         * Java中不允许直接对自定义的对象调用sort直接排序,需要实现Comparable接口         * 两种方法实现自定义排序:         * 方法一:添加一个比较容器Comparator         * 方法二:自定义的Java对象实现Comparable接口         * (Java中的包装类和String都实现了Comparable接口了)         * 两种方法的区别(Comparable和Comparator的区别)         * 1.Comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo().         * 2.Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)         * 而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较.         * 3.实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改         */        Collections.sort(users);        /*Collections.sort(users, new Comparator<User>() {            @Override            public int compare(User o1, User o2) {               int i = o1.getAge() - o2.getAge();               if(i == 0){                   return o1.getName().compareTo(o2.getName());               }               return i;            }        });*/        System.out.println("排序后" );        for (User user : users) {            System.out.println(user.getName() + " " + user);        }    }}