java自定义排序(Comparable与Comparator)

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);
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值