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

分别介绍下他们的功能:

(1)sorted

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

(2)sortBy

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

(3)sortWith

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

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

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

结果:

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

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

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

先看基于sortBy的实现:

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

结果:

  1. (c,,)
  2. (a,,)
  3. (b,,)

再看基于sortWith的实现:

  1. val pairs = Array(
  2. ("a", , ),
  3. ("c", , ),
  4. ("b", , )
  5. )
  6. val b= pairs.sortWith{
  7. case (a,b)=>{
  8. if(a._3==b._3) {//如果第三个字段相等,就按第一个字段降序
  9. a._1>b._1
  10. }else{
  11. a._3<b._3 //否则第三个字段降序
  12. }
  13. }
  14. }
  15. //打印结果
  16. b.map(println)

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

例子三:基于类的排序

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

  1. case class Person(val name:String,val age:Int)
  2.  
  3. val p1=Person("cat",)
  4. val p2=Person("dog",)
  5. val p3=Person("andy",)
  6.  
  7. val pairs = Array(p1,p2,p3)
  8.  
  9. //先按年龄排序,如果一样,就按照名称降序排
  10. val bx= pairs.sortBy(person => (person.age, person.name))( Ordering.Tuple2(Ordering.Int, Ordering.String.reverse) )
  11.  
  12. bx.map(
  13. println
  14. )

结果:

  1. Person(dog,)
  2. Person(cat,)
  3. Person(andy,)

再看sortWith的实现方法:

  1. case class Person(val name:String,val age:Int)
  2.  
  3. val p1=Person("cat",)
  4. val p2=Person("dog",)
  5. val p3=Person("andy",)
  6.  
  7. val pairs = Array(p1,p2,p3)
  8.  
  9. val b=pairs.sortWith{
  10. case (person1,person2)=>{
  11. person1.age==person2.age match {
  12. case true=> person1.name>person2.name //年龄一样,按名字降序排
  13. case false=>person1.age<person2.age //否则按年龄升序排
  14. }
  15. }
  16. }
  17. b.map(
  18. println
  19. )

结果:

  1. Person(dog,)
  2. Person(cat,)
  3. Person(andy,)
  1. 总结:
  2.  
  3. 本篇介绍了scala里面的三种排序函数,都有其各自的应用场景:
  4.  
  5. sorted:适合单集合的升降序
  6.  
  7. sortBy:适合对单个或多个属性的排序,代码量比较少,推荐使用这种
  8.  
  9. sortWith:适合定制化场景比较高的排序规则,比较灵活,也能支持单个或多个属性的排序,但代码量稍多,内部实际是通过java里面的Comparator接口来完成排序的。
  10.  
  11. 实际应用中,可以根据具体的场景来选择合适的排序策略。

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. 使用CIFAR-10样本数据集测试卷积神经网络(ConvolutionalNeuralNetwork,CNN)

    第一次将例程跑起来了,有些兴趣. 参考的是如下URL: http://www.yidianzixun.com/article/0KNz7OX1 本来是比较Keras和Tensorflow的,我现在的水 ...

  2. gradle 构建scala程序

    一.build.gradle 二.gradle build ===================== 执行scala scala main.scala

  3. Centos7安装nginx后提示“Welcome to nginx on Fedora!”,conf.d目录下无default.conf文件

    问题描述 在腾讯云centos7上安装nginx sudo yum install nginx 打开默认网页显示 Welcome to nginx on Fedora! 且 /etc/nginx/co ...

  4. onclick与click的区别

    用法: Obj.click(function(){ }); Obj.onclick=function(){ } 相同:效果一样. 区别: 用户或浏览器执行的某种动作,例如click load,mous ...

  5. C++中得sort函数的比较函数(第三个参数)为什么要声明为static

    sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中 ...

  6. RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net

    SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...

  7. Hibernate框架的查询方式

    技术分析之Hibernate框架的查询方式        1. 唯一标识OID的检索方式        * session.get(对象.class,OID)    2. 对象的导航的方式       ...

  8. python是什么编程语言。

    python是一门动态解释性的强类型定义语言.

  9. 堆优化Prim 最小生成树 模板

    #include <bits/stdc++.h> using namespace std; const int MAXN = 5005; const int MAXM = 200005; ...

  10. 模拟赛 提米树 题解 (DP+思维)

    题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...