深入学习java源码之Comparator.reverseOrder()与Comparator.compare()
Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
Comparator接口
Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。
再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。
如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。
于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。
o1和o2相等返回0,否则o1如果是true 就表示o1大于o2。
java8的Comparators进行集合分组排序
多个比较器用于字段的名字,姓氏和年龄。
Comparator.thenComparing()
使用内置的比较器链接支持,在Java 8中对列表进行排序非常容易。您通过实现Comparator
接口创建了独立的字段排序器,并将它们链接到Collection.sort()
方法中。
CompareToBuilder
值按照它们附加到构建器的顺序进行比较。如果任何比较返回非零结果,则该值将是返回的结果,CompareToBuilder.toComparison()
并且将跳过所有后续比较。
修改模型中的compareTo()方法
排序列表
CompareToBuilder与比较器接口
如果您不愿意修改Comparable
界面,您仍然可以利用Comparator
界面对列表CompareToBuilder
进行排序。
ComparisonChain
与Apache Common lang类似CompareToBuilder
,Google guava库提供了有用的类ComparisonChain
来排序对象列表。
比较链示例
链式比较器
这是使用多个比较器按多个字段对列表对象进行排序的最基本示例。在这种方法中,创建比较器的有序列表并将其传递给迭代比较器并使用每个比较器对当前列表进行排序的方法。
在列表中按排序应用组
现在我们可以使用上面的GroupBySorter
方法对员工列表进行排序。下面的代码按以下顺序对员工列表进行排序:
- 名字
- 姓
- 年龄
java源码
Modifier and Type | Method and Description |
| 比较其两个参数的顺序。 |
| 接受从类型 |
| 接受提取从一个类型排序键的功能 |
| 接受从类型 |
| 接受从类型 |
| 接受提取功能 |
| 指示某个其他对象是否等于此比较器。 |
| 返回一个以自然顺序比较Comparable对象的比较器 。 |
| 返回一个空友好的比较是认为 |
| 返回一个比较容易的比较器,它将 |
| 返回一个比较器,强制该比较器的相反顺序。 |
| 返回一个与 自然排序相反的比较器。 |
| 用另一个比较器返回一个字典顺序比较器。 |
| 返回具有提取 |
| 返回具有提取要与给定 |
| 返回具有提取 |
| 返回具有提取 |
| 返回具有提取 |