Collections中使用Comparable接口或Comparator接口实现对象排序

概述

Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合,其中有这样一个方法

public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
}

Comparable接口

使用Comparable接口对对象进行排序

public static <T extends Comparable<? super T>> void sort(List<T> list) {

}

在这个方法中,如果要求传入的类要实现Comparable接口,如果没有实现Comparable接口,那么是不允许调用这个方法的

那么Comparable接口是用来做什么的呐?

我们先来看这样一个例子

 List<Integer> integerList = new ArrayList<>();
        integerList.add(3);
        integerList.add(4);
        integerList.add(5);
        integerList.add(1);
        integerList.add(2);

        
        Collections.sort(integerList);
        
        System.out.println(integerList);

在这里插入图片描述
我们可以看到我们乱序往integerList中写入,3,4,5,1,2,再调用Collections.sort(integerList);之后输出的是正确排序。怎么做到的呐?

我们知道调用Collections.sort方法需要List中的对象实现Comparable,那么Integer是否实现了呐?

我们点进Integer中去寻找
在这里插入图片描述
答案是肯定的,它确实实现了Comparable,我们知道实现Comparable接口必须实现compareTo方法,Integer中是否实现了呐?

当然
在这里插入图片描述

加上接口名compareTo,我们就能推测Comparable接口的作用了,它是用来定义两个对象如何比较的接口,我们可以看到compareTo调用了compare方法,在compare方法中可以看到如下实现
在这里插入图片描述

(x < y) ? -1 : ((x == y) ? 0 : 1)

的意思是如果x<y返回 -1 ,x==y返回0,那么也就能知道当x>y时返回1了,刚刚看到这样写法是从小到大的返回,如果要从大到小的返回,该怎么做呐?

这样做

(x < y) ? 1 : ((x == y) ? 0 : -1)

只需要将1和-1的位置调换一下就好了,它的返回就是从大到小了,当然我们是没有办法改变Integer中的compare方法的,但是当我们定义一个类的时候是可以这样实现的,当然如果你想调用Collections.sort方法,那么在你定义的类中应该实现Comparable接口,重写compareTo方法。

来看个例子吧,在这个类中我们实现了Comparable,接口并重写了重写compareTo方法

public class Fish implements Comparable<Fish> {

    private int age;
    private String name;

    public Fish(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "SortTest{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }



    @Override
    public int compareTo(Fish o) {

        if (this.age<o.age){
            return  -1;
        }else if (this.age>o.age){
            return 1;
        }
        return 0;

    }
}

在compareTo我们定义的是年龄小的返回-1,相等返回0,大的返回1,那么它就应该是按年龄从小到大排序的,我们来看

List<Fish> list= new ArrayList<>();
        list.add(new Fish(5, "DogA"));
        list.add(new Fish(6, "DogB"));
        list.add(new Fish(7, "DogC"));

        Collections.sort(list);
        
        System.out.println(list);

在这里插入图片描述
结果符合,完美!!!

如果想要按年龄从大到小的排序呐?只需要做如下修改即可
在这里插入图片描述
我们知道,小于返回-1,相等返回0,大于返回1,显示的是从小到大排序,当小于返回1,相等返回0,大于返回-1时,显示是就是从大到小的排序。

我们看一下结果

在这里插入图片描述
结果与预期一致,perfect

最后补充一点:

public int compareTo(Fish o) {

        if (this.age<o.age){
            return  -1;
        }else if (this.age>o.age){
            return 1;
        }
        return 0;

}

很多人,可能会思考compareTo要如何写呐?你想如何写都行,它是用来定义你如何比较两个对象的,你想按年龄、按名字比都可以,按年龄比按如上写法写,按名字比则可以考虑用equal比。总的来说,就是,你想按年龄、按名字比都可以,但是你得在compareTo中写清楚比较的方法,这样调用Collections.sort的时候,sort就知道如何比较两个相同对象了。

ok。。完美!

Comparator类实现对象的排序

Comparator也可以实现对象的排序,它和Comparable的区别是什么呐?在一个类中可以实现多个Comparator对 对象 进行排序,仍然以Fish为例

public class Fish {

    private int age;
    private String name;

    public Fish(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "SortTest{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public static Comparator<Fish> FishAgeComparator = new Comparator<Fish>() {

        @Override
        public int compare(Fish s1, Fish s2) {
            int age1 = s1.age;
            int age2 = s2.age;

            return age1-age2;

        }
    };

}

public static void main(String args[]){
        List<Fish> list= new ArrayList<>();
        list.add(new Fish(5, "DogA"));
        list.add(new Fish(6, "DogB"));
        list.add(new Fish(7, "DogC"));

        Collections.sort(list, Fish.FishAgeComparator);

        System.out.println(list);

    }

结果一样,没有问题!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值