列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型

一.Collections.sort()

Collections.sort()用于List类型的排序,其提供了两个重载方法:

1.sort(List<T> list)

(1)List指定泛型时只能指定引用数据类型,也就是说无法用于基本数据类型的排序。

(2)如果T是String类型,则会按字典顺序进行升序排序。

(3)对于八大包装类,除了Boolean以外均实现了Comparable接口,默认按数字顺序进行升序排序。

(4)如果T是自定义数据类型,则前提是T必须实现Comparable接口,并重写其compareTo()方法,才能使用该方法进行排序。

2.sort(List<T> list , Comparator<? super T> c)

(1)这种方式会对传入的List对象,按照比较器c的规则进行排序

(2)如果类T实现过Comparable接口,则比较器Comparator的比较规则会优先于Comparable的比较规则

可以看到原本Student类实现Comparable接口,在compareTo()方法中要求按age进行升序排序,但是执行Collections.sort()方法时会优先按传入的比较器进行排序,而比较器中的compare()方法要求按age进行降序排序。

(3)上述写法也可以通过lambda表达式简写

二.list.sort()

list.sort()只有一种写法,没有重载方法

1.sort(Comparator<? super E> c)

(1)这个sort()方法是属于List类的一个普通方法,通过对象调用

(2)需注意的是:使用该方法必须传入一个Comparator对象指定排序规则。列表指定的泛型对象实现的Comparable接口在该方法的调用中是无效的,只能按Comparator指定的排序规则排序。

(3)上述Collections.sort()的例子中,studentList的排序可以替换成:

(4)同样可以用lambda表达式简写

三.list.stream().sorted()

list.stream().sorted()存在两个重载方法

1.list.stream().sorted().collect(Collectors.toList())

(1)使用方法与上述的Collections.sort()相同,sorted()会对List对象进行自然排序

(2)List指定的泛型对象需要实现Comparable接口,排序时会按其compareTo()方法进行排序

(3)上述studenList使用这种方法进行升序排序

2.list.stream().sorted(Comparator<? super E> c).collect(Collectors.toList())

(1)使用方法与上述sort(Comparator<? super E> c)相同

(2)上述studenList使用这种方法进行降序排序(使用lambda表达式简写)

3.注意

(1)sorted()实际是Stream类的一个普通方法,因此需要通过list.stream()先获取到列表的流对象才能调用

(2)**list.stream().sorted()并不会对list对象进行排序,而是会返回一个按排序规则排好的Stream对象,而原list对象不会发生任何改变。**而.collect(Collectors.toList())用于将Stream对象转成List对象。

(3)按照上述说法,若想对list进行排序,则该方法的完整使用方法是:

list = list.stream().sorted().collect(Collectors.toList());

数组类型

一.Arrays.sort()

Arrays.sort()提供了两个重载方法

1.Arrays.sort(T[] a)

(1)若T为基本数据类型,则按照数字顺序进行升序排序

(2)若T为String类型,则按照字典顺序进行升序排序

(3)若T为引用数据类型,则T必须实现Comparable接口并重写其compareTo()方法才能排序

(4)八大包装类除Boolean外都实现了Comparable接口,按数字顺序升序排序

(5)对Student类型数组进行升序排序(上述Student类已经实现了Comparable接口,其compareTo()方法指定按age进行升序排序)

2.Arrays.sort(T[] a, Comparator<? super T> c)

(1)用法与上述使用Comparator进行排序的方式相同

(2)对students数组进行降序排序(使用lambda表达式简写)

总结

1.Collections

(1)sort()

(2)是Collections类的静态方法,通过类调用

(3)需传入排序对象,排序对象就是传入的列表对象

(4)支持Comparable和Comparator两种方式

(5)用于List对象,只支持引用数据类型

2.List

(1)sort()

(2)是List类的普通方法,通过对象调用

(3)无需传入排序对象,排序对象就是调用者本身

(4)只支持Comparator

(5)用于List对象,只支持引用数据类型

3.Stream

(1)sorted()

(2)是Stream类的普通方法,通过对象调用

(3)无需传入排序对象,排序对象不是调用者,而是一个新的对象并以返回值返回

(4)支持Comparable和Comparator两种方式

(5)用于List对象,只支持引用数据类型

4.Arrays

(1)sort()

(2)是Arrays类的静态方法,通过类调用

(3)需传入排序对象,排序对象就是传入的数组对象

(4)支持Comparable和Comparator两种方式

(5)用于数组对象,支持基本数据类型和引用数据类型

相关推荐
风动也无爱15 分钟前
Java的正则表达式和爬虫
java·爬虫·正则表达式
訴山海15 分钟前
解决Excel文件流读取数字为时间乱码问题
java·文件流
今日之风甚是温和22 分钟前
【Excel】拆分多个sheet,为单一表格
java·excel·sheet·vb宏
聂 可 以29 分钟前
IDEA一键启动多个微服务
java·微服务·intellij-idea
刘大浪32 分钟前
IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题一)
java·ide·intellij-idea
菠菠萝宝1 小时前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
CoderJia程序员甲1 小时前
重学SpringBoot3-如何发送 Email
java·spring boot·后端·email
初晴~1 小时前
【spring】参数校验Validation
java·c++·spring boot·后端·python·spring·validation
chudaxiakkk1 小时前
记录spring-boot 3.X版本整合RocketMq
java·spring boot·rocketmq
Du_XiaoNan1 小时前
Flowable第三篇、Flowable之任务分配(任务分配、流程变量、候选人和候选人组)
java·开发语言