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

分别介绍下他们的功能:

(1)sorted

对一个集合进行自然排序,通过传递隐式的Ordering

(2)sortBy

对一个属性或多个属性进行排序,通过它的类型。

(3)sortWith

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

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

val xs=Seq(,,,,,)
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(, , , , , )
List(, , , , , )
==============sortBy排序=================
List(, , , , , )
List(, , , , , )
==============sortWith排序=================
List(, , , , , )
List(, , , , , )

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

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

先看基于sortBy的实现:

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

结果:

(c,,)
(a,,)
(b,,)

再看基于sortWith的实现:

val pairs = Array(
("a", , ),
("c", , ),
("b", , )
)
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",)
val p2=Person("dog",)
val p3=Person("andy",) 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,)
Person(cat,)
Person(andy,)

再看sortWith的实现方法:

case class Person(val name:String,val age:Int)

    val p1=Person("cat",)
val p2=Person("dog",)
val p3=Person("andy",) 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,)
Person(cat,)
Person(andy,)
总结:

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

sorted:适合单集合的升降序

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

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

实际应用中,可以根据具体的场景来选择合适的排序策略。

Scala里面的排序函数的使用的更多相关文章

  1. Scala List的排序函数sortWith

    //原始方法: //val list=List("abc","bcd","cde") scala> list.sortWith( (s ...

  2. SQL中几个常用的排序函数

         最近使用窗口函数的频率越来越高,这里打算简单介绍一下几个排序的函数,做一个引子希望以后这方面的问题能够更深入的理解,这里先简单介绍一下几个简单的排序函数及其相关子句,这里先从什么是排序开始吧 ...

  3. Sql Server系列:排序函数

    在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...

  4. [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)

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

  5. SQL Server排序函数row_number和rank的区别

    SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...

  6. php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)

    测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...

  7. oracle 分组排序函数

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示例和 ...

  8. Scala 流程空间,函数,异常处理

    1,)首先留意一下下边的代码块,他是怎么运行的,貌似在c#中他是出错的,不应该出现这样的写法的,但在scala中侧不然: package com.dt.study /** * The package ...

  9. oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

随机推荐

  1. RBF神经网络——直接看公式,本质上就是非线性变换后的线性变化(RBF神经网络的思想是将低维空间非线性不可分问题转换成高维空间线性可分问题)

    Deeplearning Algorithms tutorial 谷歌的人工智能位于全球前列,在图像识别.语音识别.无人驾驶等技术上都已经落地.而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶 ...

  2. 用数组实现strstr函数

    用数组实现strstr函数char * mystrstr(char * dest, char *src){ int i = 0; int j = 0; //匹配个数 int count = 0; in ...

  3. SQL Server视频总结

    经过这几天艰苦卓绝的奋斗,我终于把视频看完了,可是不知道自己看了什么,下面就来总结一下,看看都学到了那些. 数据库和VB中有很多地方相似,我们可以直接搬过来,而不必再当做新知识给自己增加难度,要调动自 ...

  4. oracle lock

    数据库锁介绍:  https://www.cnblogs.com/springsnow/p/9990295.html#_label2_0 总结1:查询oracle锁定的表: 1.锁相关表 SELECT ...

  5. vscode——设置自动保存

    前言 懒就一个字 步骤 打开设置第一项就是,选择焦点改变自动保存即可

  6. HTTP头部

    10-URI的基本格式以及与URL的区别 HTTP连接的常见流程 从TCP编程上看HTTP请求处理 长连接与短连接 补充一下代理的知识 什么是正向代理,什么是反向代理? 想在外部公网访问公司内部局域网 ...

  7. 指数基金介绍专栏(8):国企指数(H股指数)详细介绍,最新资料解析,看这一篇就够了

    作者:牛大 | 公众号:定投五分钟 大家好,我是牛大.每天五分钟,投资你自己:坚持基金定投,终会财富自由! 昨天牛大给大家介绍了恒生指数,没看的朋友可以去公众号看一下. 指数基金介绍专栏(7):恒生指 ...

  8. LIO -SCSI target

    2010年底,LIO 项目获选成为新的内核态的 SCSI target,取代原有的用户态的 STGT 项目.当时有两个主要的竞争项目(LIO和SCST),都在努力将代码并入主线内核.本文将比较着两个项 ...

  9. P5025 [SNOI2017]炸弹

    原题链接  https://www.luogu.org/problem/P5025 闲话时刻: 第一道 AC 的黑题,虽然众人皆说水... 其实思路不是很难,代码也不是很难打,是一些我们已经学过的东西 ...

  10. LOJ#565. 「LibreOJ Round #10」mathematican 的二进制 分治,FFT,概率期望

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ565.html 前言 标算真是优美可惜这题直接暴力FFT算一算就solved了. 题解 首先,假装没有进位,考虑解决这个问 ...