`
qindongliang1922
  • 浏览: 2183807 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117530
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125921
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59897
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71301
社区版块
存档分类
最新评论

Scala里面的排序函数的使用

阅读更多


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

分别介绍下他们的功能:

(1)sorted

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

(2)sortBy

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

(3)sortWith

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



例子一:基于单集合单字段的排序
````
  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接口来完成排序的。

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

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
0
0
分享到:
评论

相关推荐

    Scala函数式编程

     “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。”  ——Chris Nauroth, Hortonworks  “边干边学,而非只是阅读。”  ——Douglas Alan、Eli和Edythe L. Broad,哈佛和麻省理工学院

    头歌Scala中集合的使用

    Scala中集合的使用 大学生 1. List 列表的使用 2. Set 集合的使用 3.Map 映射的使用 4. 元组的使用

    Scala脚本:函数式编程的实用指南

    本文将详细介绍如何使用Scala脚本进行函数式编程,并提供丰富的代码示例。 Scala的函数式编程特性为开发者提供了强大的工具,以编写更简洁、更安全和更可维护的代码。通过掌握函数式编程的基本概念和技巧,Scala...

    高阶函数 in Scala

    详细讲解Scala中的高阶函数部分,具体实例剖析Scala中高阶函数的意义所在,对控制抽象进行了详细的说明,参考书籍《快学Scala》、《Programming in Scala》

    Scala函数式编程.pdf

    函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。

    function programming in scala 英文原版 scala函数式编程

    英文原版 scala函数式编程 function programming in scala

    Scala与Clojure函数式编程

    函数式编程是编程范式之一,它强调使用函数来表达计算,而非传统命令式的编程方式。在函数式编程中,数据和函数结合得非常紧密,数据被视为函数作用的原象,而函数则是数据的变换器。函数式编程在逻辑上摒弃了可变...

    mongo-scala-drive的使用demo

    MongoDB 是一个流行的开源文档型数据库,而 Scala 是一种强大的函数式编程语言。在 Scala 中与 MongoDB 进行交互,通常我们会使用 `mongo-scala-driver`,而不是 `mongo-java-driver`,因为 Scala 驱动提供了更符合 ...

    scala + mybatis 数据库查询

    Scala是一种强大的多范式编程语言,它结合了面向对象和函数式编程的特性。MyBatis则是一款流行的Java持久层框架,主要用于简化数据库操作。在本项目中,"scala + mybatis 数据库查询",我们将探讨如何将Scala与...

    Scala中的函数式特征与并发.pdf

    函数式编程语言被认为是编程范式的一种,它强调使用函数来构建程序,并且这些函数是不可变的,没有副作用,意味着它们不会修改程序的状态。与命令式编程不同,命令式编程依赖于改变程序状态的语句来实现目的。 ...

    使用Scala进行Web开发:构建你的第一个Web应用.md

    使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发...

    Scala与Clojure函数式编程模式:Java虚拟机高效编程1

    函数式编程是一种编程范式,强调使用函数来构造程序,将计算视为数学函数的求值过程。与传统的命令式编程不同,函数式编程中避免使用副作用,强调纯函数,即相同的输入永远产生相同的输出,不受外部状态的影响。这种...

    Scala函数式编

    在Scala中,我们可以使用`_`符号实现部分应用函数,即只提供部分参数,得到一个新的函数,等待接收剩余的参数。 闭包 闭包是指能够访问自身作用域内的变量,即使该作用域已经退出,它仍然保持对该变量的引用。在...

    读书笔记:基于scala语法学习函数式编程方法.zip

    读书笔记:基于scala语法学习函数式编程方法

    scala3 scala3 scala3 scala3 scala3

    在Scala3中,你可以使用单表达式函数,而无需使用`=&gt;`。例如,`x =&gt; x + 1` 可以直接写为 `(x) + 1`。此外,`def` 和 `val` 的定义现在可以合并,使得函数定义更加紧凑。 模式匹配的增强也是Scala3的重要特性。新的...

Global site tag (gtag.js) - Google Analytics