Scala比较器:Ordered与Ordering

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala比较器:Ordered与Ordering相关的知识,希望对你有一定的参考价值。

参考技术A

在项目中,我们常常会遇到排序(或比较)需求,比如:对一个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的隐式转换即可:

Scala的特质

一:

  关键字:trait。

  使用方式:通过extends和with方式的混入特质。

  使用场景:当我们不想扩展其它的类的时候必须使用entends,当我们需要扩展其它类的时候,就必须使用with,可以混入多个特质,连续使用with即可。

  Ordered特质:主要用于对象之间的比较,和Java的Comparable类似。
  特质的作用:可以实现堆叠的改变,代码中的例子是对一个队列的元素进行加倍,加1,和过滤。

二:特质的例子

package 特质

/**
  * @Author:Alex_lei
  * @Description:
  */
object Trait 
  def main(args: Array[String]): Unit = 
    val lbld = new Lbld
    lbld.f()

    val d:Dog = lbld
    d.f()

    val tt = new Test_trait
    tt.say
    tt.f()
  


/**
  * 使用extends混入特质
  */
class Lbld extends Dog

  override def f(): Unit = println("I am lbld")





/**
  * trait叫特质,是Scala里面代码复用的基础单元,没有类参数这个用法。
  * 通过混入的方式到类中
  * 类可以混入多个特质
  * 与Java的接口类似
  */
trait Dog
  def f(): Unit =
    println("I am dog")
  


class Animal
  val say = println("I am an animal")


/**
  * 需要继承某个父类,然后使用with关键字混入特质
  */
class Test_trait extends Animal with Dog
  override val say: Unit = println("extends Animal")

  override def f(): Unit = println("with Dog")



/**
  * 使用extends和with分别是什么场景
  * 该类如果不扩展其它的类,那么就必须用extends
  * 如果想要扩展其它的类,就必须用with,可以混入多个特质,每个特质前面跟一个with关键字
  */

 三:Ordered特质

package 特质

/**
  * @Author:Alex_lei
  * @Description: 当我们想对某几个对象进行排序时,并不需要定义四个比较运算符
  *              直接使用Ordered特质即可,混入Ordered特质,重写compare方法。
  */
object Orderd 
  def main(args: Array[String]): Unit = 
    val p1 = new People("alex",22,"beijing")
    val p2 = new People("Lily",21,"shanghai")
    val bool = p1>p2
    println(bool)
  


class People(val name:String,val age:Int,val add:String) extends Ordered[People]

  override def compare(that: People): Int = 
    this.name.compareTo(that.name)
  

 

以上是关于Scala比较器:Ordered与Ordering的主要内容,如果未能解决你的问题,请参考以下文章

Scala入门到精通——第二十节 类型參数

Scala零基础教学61-80

Scala的特质

Guava源码学习Ordering

03-Comparator 和 Ordering

error: No implicit Ordering defined for Any