在有些时候我们需要对对象进行一个排序,这时间就会使用到Java的比较器。可是比较器这个东西学完之后总觉得理解不真切,过一段时间用的时候又忘了如何去用,很头疼。

Java实现对象排序的方式有两种
  • 自然排序:java.lang.Comparable
  • 定制排序:java.lang.Comparator

我们先来看看自然排序java.lang.Comparable

1. 自然排序java.lang.Comparable接口

比较规则是啥: 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零。

分析:因为是自然排序,所以结果是按照从小到大排的。而java比较器是根据返回的结果值来确定当前两个比较对象的先后顺序的:结果值为1—两个对象需要互换位置;结果值为0—两个对象无需互换位置;结果值为-1—两个对象无需互换位置。

问题: 上面说的都比较好理解,可是如果要求把对象按照从大到小的顺序排呢?

这时间就需要根据两个对象的大小调整返回值了。

其实,对于java比较器在比较时都是以this所指的这个对象为基准的。例如this所指的对象为a,传过来的对象为b。此时,如果 a - b > 0 说明 a 比 b 大,又因为是自然排序所以需要互换位置,返回值为1;如果 a - b = 0 说明 a 和 b 相等,无需互换位置,返回值为0;如果 a - b < 0,说明 a 比 b 小,无需互换位置,返回值为-1。

所以,当需要从大到小升序排列时,返回值应该根据 a,b的差值做相应的调整:如果 a - b > 0,说明 a 比 b 大,又因为要升序排列,所以 a 和 b 无需互换位置,应当返回 -1;如果 a - b = 0,说明 a 和 b 相等,a 和 b 无需互换位置,应当返回 0;如果 a - b < 0,说明 a 比 b小,又因为要升序排列,所以 a 和 b需互换位置,应当返回 1。

2. 定制排序java.lang.Comparator

如果你是一个有Java基础的大哥,你就知道自然排序和定制排序其实区别不大,所以应当注意的就是使用条件。

  • 如果你想同一个类的某些对象永远都能比较,那你就采用自然排序,也即是实现Comparable接口,重写comparaTo方法;
  • 如果你只是想临时的对同一个类的某些对象做比较,那你就采用定制排序,也即是用时new 一个比较器对象即可;