jdk 1.8 list 排序_「Java必修课」一图说尽排序,一文细说Sorting

简说排序

排序是极其常见的使用场景,因为在生活中就有很多这样的实例。国家GDP排名、奥运奖牌排名、明星粉丝排名等,各大排行榜,给人的既是动力,也是压力。

而讲到排序,就会有各种排序算法和相关实现,本文不讲任何排序算法,而只专注于讲使用。通过实例给大家展示,我们可以了解怎样使用既有的工具进行排序。Linux之父说:

Talk is cheap. show me the code!

本文JDK版本为Java 8,但并不代表所介绍到的所有方法只能在JDK1.8上跑,部分方法在之前的版本就已经给出。

如下本次整理的图,记住图中的方法,就能轻松应对大多数场景,赶紧收藏起来吧,哈哈

ef293264915749e81b1c0881ab6ad54c.png

---

两个接口

Comparable

先上代码:

package java.lang;public interface Comparable {  public int compareTo(T o);}

可以看出这个接口只有一个方法,这个方法只有一个参数,实现了这个接口的类就可以和同类进行比较了。这个方法所实现的,就是比较法则,也是说,它表示如何对两个对象进行比较。它返回的是一个整数int:

  • 返回正数,代表当前对象大于被比较的对象;
  • 返回0,代表当前对象等于于被比较的对象;
  • 返回负数,代表当前对象小于被比较的对象。

实现了该接口后,我们就可以使用Arrays.sort()和Collections.sort()来进行排序了。不然对象没有比较法则,程序肯定是不知道如何进行比较排序的。像我们常用的类String、Integer、Double、Date等,JDK都帮我们实现了Comparable接口,我们可以直接对这类对象进行比较排序。举个例子,Date Comparable的实现:

public int compareTo(Date anotherDate) { long thisTime = getMillisOf(this); long anotherTime = getMillisOf(anotherDate); return (thisTime

需要注意的是,当我们自己去实现Comparable接口时,一定要注意与equals()方法保持一致。当两个对象是equals的,compare的结果应该是相等的。

Comparator

还是先看代码,看看接口定义吧:

package java.util;@FunctionalInterfacepublic interface Comparator {  int compare(T o1, T o2); }

它是一个函数式接口,它的compare方法有两个参数,代表进行比较的两个对象。这个接口代表了可以作为某种对象比较的一种法则,或叫一种策略。它的返回值正负代表意义与Comparable接口的方法一样。它的使用通常会有三种方式:

实现类匿名类Lambda表达式

在Java8之后,我们一般用Lambda比较多,也比较灵活优雅。

两个接口的比较

两个接口功能都是用于比较排序,但其实有很大的区别。

两者方法参数不同,Comparable只有一个参数,表示被比较的对象,因为它的方法是位于需要比较的类里的,所以只要一个参数就可以了;而Comparator的比较方法则有两个参数,分别表示比较对象和被比较对象。Comparable与对象绑定,位于对象内,我们可以称之为内比较器;而Comparator是独立于需要比较的类的,我们可以称为外比较器。当类实现了Comparable方法后,比较法则就确定了,我们称之为自然比较方法,我们无法给它实现多种比较方法;而因为Comparator独立于外,我们可以为同一个类提供多种Comparator的实现,这样来提供多种比较方法/策略,如升序倒序,因此我们也可以将Comparator看成是一种策略模式

相对于Comparable,Comparator有一定的灵活性,假如一个类并没有实现Comparable接口,并且这个类是无法修改的,我们就要通过提供Comparator来进行比较排序。Comparator这种模式实现了数据与算法的解耦合,对于维护也是很方便的。

工具类

十分友好的是,JDK为我们提供了工具类,它们的静态方法可以帮助我们直接对数组和List进行排序。

数组排序Arrays

Arrays的sort方法可以对已经实现了Comparable接口的进行排序,同时还可指定排序的范围。

//Arrays.sort对String进行排序String[] strings = {"de
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值