排序方法在实际的应用场景中非常常见,Scala里面有三种排序方法,分别是: sortedsortBysortWith

分别介绍下他们的功能:

  • (1)sorted

对一个集合进行自然排序,通过传递隐式的Ordering
源码中有两点值得注意的地方:
1.sorted方法中有个隐式参数ord: Ordering。
2.sorted方法真正排序的逻辑是调用的java.util.Arrays.sort。

  def sorted[B >: A](implicit ord: Ordering[B]): Repr = {val len = this.lengthval arr = new ArraySeq[A](len)var i = 0for (x <- this.seq) {arr(i) = xi += 1}java.util.Arrays.sort(arr.array, ord.asInstanceOf[Ordering[Object]])val b = newBuilderb.sizeHint(len)for (x <- arr) b += xb.result}
  • (2)sortBy

对一个属性或多个属性进行排序,通过它的类型。
sortBy最后也是调用的sorted方法。不一样的地方在于,sortBy前面还需要提供一个属性。

  def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr = sorted(ord on f)
  • (3)sortWith

基于函数的排序,通过一个comparator函数,实现自定义排序的逻辑。

def sortWith(lt: (A, A) => Boolean): Repr = sorted(Ordering fromLessThan lt)

例子一:基于单集合单字段的排序

val xs=Seq(1,5,3,4,6,2)println("==============sorted排序=================")println(xs.sorted) //升序println(xs.sorted.reverse) //降序println("==============sortBy排序=================")println( xs.sortBy(d=>d) ) //升序println( xs.sortBy(d=>d).reverse ) //降序println("==============sortWith排序=================")println( xs.sortWith(_<_) )//升序println( xs.sortWith(_>_) )//降序

结果:

==============sorted排序=================
List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)
==============sortBy排序=================
List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)
==============sortWith排序=================
List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)

例子二:基于元组多字段的排序

注意多字段的排序,使用sorted比较麻烦,这里给出使用sortBy和sortWith的例子

先看基于sortBy的实现:

val pairs = Array(("a", 5, 1),("c", 3, 1),("b", 1, 3))//按第三个字段升序,第一个字段降序,注意,排序的字段必须和后面的tuple对应val bx= pairs.sortBy(r => (r._3, r._1))( Ordering.Tuple2(Ordering.Int, Ordering.String.reverse) )//打印结果        bx.map( println )

结果:

(c,3,1)
(a,5,1)
(b,1,3)

再看基于sortWith的实现:

val pairs = Array(("a", 5, 1),("c", 3, 1),("b", 1, 3))val b= pairs.sortWith{case (a,b)=>{if(a._3==b._3) {//如果第三个字段相等,就按第一个字段降序a._1>b._1}else{a._3<b._3 //否则第三个字段降序}}}//打印结果b.map(println)

从上面可以看出,基于sortBy的第二种实现比较优雅,语义比较清晰,第三种灵活性更强,但代码稍加繁琐

例子三:基于类的排序

先看sortBy的实现方法 排序规则:先按年龄排序,如果一样,就按照名称降序排

case class Person(val name:String,val age:Int)val p1=Person("cat",23)val p2=Person("dog",23)val p3=Person("andy",25)val pairs = Array(p1,p2,p3)//先按年龄排序,如果一样,就按照名称降序排val bx= pairs.sortBy(person => (person.age, person.name))( Ordering.Tuple2(Ordering.Int, Ordering.String.reverse) )bx.map(println)

结果:

Person(dog,23)
Person(cat,23)
Person(andy,25)

再看sortWith的实现方法:

case class Person(val name:String,val age:Int)val p1=Person("cat",23)val p2=Person("dog",23)val p3=Person("andy",25)val pairs = Array(p1,p2,p3)val b=pairs.sortWith{case (person1,person2)=>{person1.age==person2.age match {case true=> person1.name>person2.name //年龄一样,按名字降序排case false=>person1.age<person2.age //否则按年龄升序排}}}b.map(println)

结果:

Person(dog,23)
Person(cat,23)
Person(andy,25)

总结:

本篇介绍了scala里面的三种排序函数,都有其各自的应用场景:

sorted:适合单集合的升降序

sortBy:适合对单个或多个属性的排序,代码量比较少,推荐使用这种

sortWith:适合定制化场景比较高的排序规则,比较灵活,也能支持单个或多个属性的排序,但代码量稍多,内部实际是通过java里面的Comparator接口来完成排序的。

转载于:https://blog.csdn.net/u010454030/article/details/79016996

Scala 排序函数 sorted sortBy sortWith相关推荐

  1. scala中sorted,sortby,sortwith的用法(转)

    scala中sorted,sortWith,sortBy用法详解 2017年07月23日 23:07:51 bitcarmanlee 阅读数:9249 版权声明:本文为博主原创文章,未经博主允许不得转 ...

  2. Python之排序函数sorted()详解

    文章目录 描述 语法 返回值 实例 一般用法: 高级用法: 1.lambda函数 2.operator.itemgetter() 3.机器学习实例 参考 描述 sorted() 函数对所有可迭代的对象 ...

  3. Python中的排序函数--sorted()函数

    选择题 以下python代码输出什么? a = [2,3,1] sorted(a) print(a) A a B [3, 2, 1] C [2, 3, 1] D [1, 2, 3] 问题解析 1.so ...

  4. python中sorted函数的作用_Python中排序方法sort、函数sorted的key参数的作用分析

    从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 'key' 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据. 那么怎么使用这个 ...

  5. python内置函数sorted(x)的作用是_Python内置filter与sorted函数

    Python内部提供了序列过滤函数 filter . 接收参数为 一个函数以及一个序列.函数依次作用于序列中的每一个元素,并根据返回值是True 或者 False 判断是否删除该元素. 样例如下 # ...

  6. scala里集合排序函数的使用

    2019独角兽企业重金招聘Python工程师标准>>> 排序方法在实际的应用场景中非常常见,Scala里面有三种排序方法,分别是: sorted,sortBy ,sortWith 分 ...

  7. python 排序函数 sort sorted 简介

    sort() 是Python列表的一个内置的排序方法,list.sort() 方法排序时直接修改原列表,返回None: sort() 是Python内置的一个排序函数,它会从一个迭代器返回一个排好序的 ...

  8. [转载] Python列表排序 list.sort方法和内置函数sorted

    参考链接: Python中的函数 Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时 ...

  9. 排序函数(sort()、sorted()、argsort()函数)

    python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 1 ls = list([5, 2, 3, 1, 4]) 2 new_ls = so ...

最新文章

  1. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)
  2. java调用天气预报api_java调用中国天气网api获得天气预报信息
  3. [转]分布式文件系统 MogileFS 安装手册
  4. java jxl之Excel的创建
  5. Java High CPU故障排除指南–第1部分
  6. qlabel可以选中吗_惊现凡尔赛式排版!原来微信公众号排版样式还可以“变装”?...
  7. Mybatis-plus不走租户的配置方式
  8. 【Flink】Flink checkpoint 本地磁盘 没有清除
  9. css3 animate基本属性
  10. 经典特别好用的局域网传输文件聊天工具飞秋和飞鸽传书
  11. PageHelper关闭count语句优化
  12. UR首发丹宁无性别系列,并发布潮流丹宁大片及米卡限量礼盒
  13. linux查看lv逻辑卷信息,Linux学习笔记(lvm pv物理卷—VG卷组—LV逻辑卷)
  14. android音频编辑之音频裁剪的示例代码
  15. Quantopian 入门系列一
  16. DDR3布线设计要点总结
  17. 关于Android 开发常用软件的快捷键总结
  18. 算法手撕代码61~65
  19. Python学习笔记——常用基本语法
  20. php引用中国联通M2M接口

热门文章

  1. python 中iloc_iloc索引之间的Python差异
  2. Android自定义View课程表,Android 自定义View课程表表格
  3. .NET(C#、VB)APP开发——Smobiler平台控件介绍:FingerPrint指纹识别组件
  4. 【算法】海量数据相似度计算之simhash和海明距离
  5. Django的关系映射
  6. pytest学习和使用20-pytest如何进行分布式测试?(pytest-xdist)
  7. vue组件_组件通信_todo案例
  8. 满意度调查access模板_实习满意度调查表
  9. AR识别场景中UI被挡住的问题
  10. Android ApiDemos示例解析(95):Views-Animation-3D Transition