前言
博主最近被一堆集合数组的排序搞得头大了,什么sort,什么Comparable,Comparator,compareTo,compare,这么多排序,你要干什么!我到底该用哪个?
于是决定写一篇博客来梳理一下这些方法接口,希望对你们有帮助,点个star吧😀
先来介绍一个核心算法,插入排序
一.插入排序
从无序中提取元素和有序中的元素对比,从后往前<-------对比(数组结构,如果是二叉树结构从根节点开始对比,左小右大),然后交换位置
在这里我们简化一下这个算法,只把0索引的元素看成是有序序列,不用去计算N了
遍历无序序列,取出第一个元素和有序序列比较,用o1(无序元素)-o2(有序元素)
前<----------------后
结果如果是负数,表示o1<o2,取出的无序元素小,要放到前面(如果是二叉树结构则放到左边)
结果如果是正数,表示o1>o2,取出的无序元素大,要放到后面(如果是二叉树结构则放到右边)
结果如果是0,表示o1=o2,取出的无序元素和有序元素相等,也要放到后面(如果是Set集合则不添加这个元素)
当有序元素越来越多的时候,o1就会利用二分查找来和中间的元素比较
结论:
o1-o2,升序
o2-o1,降序
二.Comparator接口
Comparator接口用于自定义排序,可以在运行时动态选择不同的排序方式。适用于复杂的排序需求
Comparator 接口是一个外部接口(在test类中使用匿名内部类实现)
compare就是这个内部类里重写的方法,他有两个参数o1和o2,分别表示无序元素(准备要排序的元素)和有序元素(已经排序好的元素)
使用场景:
1.sort引用数据类型的数组,使用自定义规则排序
o1-o2,升序
o2-o1,降序
2.创建TreeSet对象,传递比较器Comparator指定规则
Comparator是函数式接口(有且仅有一个抽象方法)有@Functionalinterface注解,可以用Lambda表达式省略,省略方法可以跳转到我的Lambda表达式内容
三.Comparable接口
Comparable接口用于自然排序,通常用于定义类的默认排序方式。适用于单一排序需求
Comparable接口是内置接口(javabean中实现,重写CompareTo)
CompareTo就是这个接口中的抽象方法,在实现类中进行重写,他只有一个参数o,表示有序元素(已经排序好的元素),在这个重写的方法中,我们还需要用到this这个关键字来表示无序元素(准备要排序的元素)
重写了CompareTo方法的类:
- 基本类型的包装类:基于数值大小。
- 字符串类:基于字典序。
- 日期和时间类:基于时间先后。
- 数学和随机数类:基于数值大小。
自定义实现类Student
重写compareTo方法
四.sort方法
sort方法是Arrays这个工具类的静态方法
当传递参数只有一个数组的时候,如果数组类型是基本数据类型,则使用快速排序算法进行排序
当传递参数只有一个数组的时候,如果数组类型是引用数据类型,则使用重写了CompareTo这个方法的方式排序
当需要使用排序规则的时候,传递Comparator匿名内部类,重写compare方法自定义排序规则