Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则

Java中Collections.sort()排序详解与自定义规则
本文介绍了Java中Collections.sort()方法的使用,包括如何对泛型集合进行排序,以及如何让自定义类实现Comparable<T>接口以完成排序。同时,文章讲解了自定义排序规则,例如根据学生类的学号或成绩进行排序。在实际操作部分,展示了排序、查找最大值和最小值的效果,并强调了使用Collections.sort()前需要确保集合元素满足Comparable接口或自定义比较逻辑。

Collections算法类

        1.Collections类是Java提供的一个集合操作工具类。

        2.Collections类定义了一系列用于操作集合的静态方法,用于实现对集合元素的排序、查找和替换等操作。

        3.Collections和Collection是不同的,前者是集合的操作类,后者是集合接口

Collections的常用静态方法(不是所有的方法)

        1.sort(集合对象):排序

        2.binarySearch(集合对象):折半查找——返回查找对象下标位置

        3.max(集合对象) \ min(集合对象):查找最大\最小值——返回查找到的对象

Collections排序

        1.实现一个类的对象之间比较大小,该类要实现Comparable<T>接口(T为通配符,匹配一个类型,实现该接口需要传入实现类作为泛型约束

        2.重写 Comparable<T>接口 public int compareTo(T o)方法 

        3.实现方法返回值约定:如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

Collections排序案例:

        学生类Student实现了Comparable<Student>接口,重写 compareTo(Student o)方法,通过比较学号实现对象之间的大小比较。

注意

        1. 使用Collections.sort(集合对象)排序时,如果集合中存的是Java自带的类型的数据,如Integer,则不需要该类型内实现Comparable<T>接口(阅读源码可发现其内部已自动实现接口重写方法),如果是自定义类型,如num类,Student类,则需要实现Comparable<T>并重写 public int compareTo(T o)方法。

        2.调用Collections.max和min不需要先排序,但是如果使用折半查找则必须先Collections.sort(集合对象)排序,不然折半查找不论是否存在都返回-1;

        3.实现compareTo(T o)方法,我们只要根据要求,对传入参数的相关数值进行判断比较,并返回相应的负整数零或者正整数即可,不需要关心比大小的具体实现,因为调用Collections.sort()方法后,其工具类会有相应的方法调用我们重写好的compareTo(T o)方法来使用。

实际操作

public class Test {
    public static void main(String[] args) {
        //创建集合并添加值
        List list = new ArrayList();
        list.add(new num(3));
        list.add(new num(2));
        list.add(new num(1));

        //调用排序方法
        Collections.sort(list);
        //输出排序后结果
        for (Object o: list) {
            System.out.println(((num)o).getNum());
        }
        System.out.println();
        //输出最大最小值
        System.out.println(((num)Collections.max(list)).getNum());
        System.out.println(((num)Collections.min(list)).getNum());
        System.out.println();
        //输出一个类型的在集合中的下标位置
        System.out.println((Collections.binarySearch(list,new num(1))));
        System.out.println();



    }
}

class num implements Comparable<num>{
    private int num;

    public num(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    /*
     *  重写的compareTo(num o)方法
     *  如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
     *  该对象:this,调用次方法的对象
     *  指定对象:参数传进来的对象
     * */
    @Override
    public int compareTo(num o) {
        return this.num>o.num?1:this.num==o.num?0:-1;
    }
}

运行后效果,先排序后遍历输出,后输出最大最小值,再输出一个指定对象所在集合的下标

 自定义排序规则

以此案例为例子解释 

        如果我们不想比学生的学号大小,假如现在要求按照学生成绩排序,那我们就根据成绩排序来做一个成绩排行榜,只需要在 compareTo 方法中把比较的参数换一下就行,比如原本是调用num这个属性,换成 this.age 和 参数对象.age 比较即可。

(此工具类有一个很好地特性,如果比较成绩,两个成绩相同,则会比较与之相邻的下一个数值型的值,判断大小来以此排列)


偏实用派的人推荐直接看这篇文章,言简意赅:Collections comparable_Azadoo的博客-优快云博客

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾欲乘风归去,又恐琼楼玉宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值