Scala比较器:Ordered与Ordering

Scala比较器:Ordered与Ordering,第1张

在项目中,我们常常会遇到排序(或比较)需求,比如:对一个Person类

按name值 逆词典序 、age值升序做排序;在Scala中应如何实现呢?

Scala提供两个特质(trait) Ordered 与 Ordering 用于比较。其中,Ordered混入(mix)Java的Comparable接口,而Ordering则混入Comparator接口。众所周知,在Java中

Ordered与Ordering的区别与之相类似:

以下源码分析基于Scala 2.10.5。

Ordered 特质更像是rich版的Comparable接口,除了compare方法外,更丰富了比较 *** 作(<, >, <=, >=):

此外,Ordered对象提供了从T到Ordered[T]的隐式转换(隐式参数为Ordering[T]):

Ordering ,内置函数 Ordering.by 与 Ordering.on 进行自定义排序:

对于Person类,如何做让其对象具有可比较性呢?我们可使用Ordered对象的函数 orderingToOrdered 做隐式转换,但还需要组织一个Ordering[Person]的隐式参数:

在实际项目中,我们常常需要对集合进行排序。回到开篇的问题——如何对Person类的集合做指定排序呢?下面用List集合作为demo,探讨在scala集合排序。首先,我们来看看List的sort函数:

若调用 sorted 函数做排序,则需要指定Ordering隐式参数:

若使用 sortWith ,则需要定义返回值为Boolean的比较函数:

若使用 sortBy ,也需要指定Ordering隐式参数:

RDD的sortBy函数,提供根据指定的key对RDD做全局的排序。sortBy定义如下:

仅需定义key的隐式转换即可:

这个是提示,+ordered表示此查询的数据是排序过的,这样在和其他表进行连接的时候就不用再做一次排序的 *** 作了,所以能加快速度。使用这个提示你一定得确保这个查询的数据确实是排序了的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9522540.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存