• 列表类型

一.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)用于数组对象,支持基本数据类型和引用数据类型

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部