Scala 函数排序

Scala 函数排序


排序方法在实际的应用场景中非常常见,Scala里面有三种排序方法,分别是: sorted,sortBy ,sortWith。 (1)sorted     对一个集合进行自然排序,通过传递隐式的Ordering。 (2)sortBy     对一个属性或多个属性进行排序,通过它的类型。 (3)sortWith     基于函数的排序,通过一个comparator函数,实现自定义排序的逻辑。

基于单集合单字段的排序
object TestSort_01{
   def main(args:Array[String]){  
          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, 7, 8, 9) List(9, 8, 7, 6, 5, 4, 3, 2, 1) sortBy排序=== List(1, 2, 3, 4, 5, 6, 7, 8, 9) List(9, 8, 7, 6, 5, 4, 3, 2, 1) sortWith排序=== List(1, 2, 3, 4, 5, 6, 7, 8, 9) List(9, 8, 7, 6, 5, 4, 3, 2, 1)

基于元组多字段的排序

多字段的排序,使用sorted比较麻烦,一般使用sortBy和sortWith。 (1)基于sortBy的实现:

object TestSort_02{
   def main(args:Array[String]){  
       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)

(2)基于sortWith的实现:

object TestSort_03{
     def main(args:Array[String]){  
          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)
    }
}

结果:

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

    可以看出,基于sortBy的实现比较优雅,语义比较清晰,基于sortWith的灵活性更强,但代码稍加繁琐。
基于类的排序

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

object TestSort_04{
     def main(args:Array[String]){  
             case class Person(val name:String,val age:Int)
             val p1=Person("cathy",23)
             val p2=Person("daniel",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(daniel,23) Person(cathy,23) Person(andy,25)

(2)sortWith的实现方法     排序规则:年龄一样,按名字降序排,否则按年龄升序排。
object TestSort_05{
     def main(args:Array[String]){  
           case class Person(val name:String,val age:Int)
           val p1=Person("cathy",23)
           val p2=Person("daniel",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(daniel,23) Person(cathy,23) Person(andy,25)

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

函数式编程(FP)是一种软件开发风格,它注重不依赖于编程状态的函数函数式代码易于测试和复用,容易实现并发,且不容易受到bug的攻击。Scala是一种能很好支持函数式编程的新兴JVM语言。《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。 从OOP到FP,思路的转化 我是使用scala做完一个项目之后,开始阅读本书。 介绍下背景: 1 程序员 2 前C程序员,linux平台,没有很深的java背景 3 用scala做过一个2年期的项目 在使用scala的过程中,碰到的问题主要体现在: 1 scala的很多语法糖不理解,不知道为啥要这么写,有种为了这么写的简洁而这么写的感觉 2 scala很多库在设计的时候,不理解原因,包括Option,Collection的很多看似有冗余的地方 3 很多scala的默认写法,不理解 4 多态的具体化,尤其是协变的意义所在 5 各种重载的符号使用 之前读过 programming in scala,对语言的整体还停留在: 1 scala用起来比java更灵活 2 强大的collection,可以更加方便的处理collection类的数据 3 不同于java的并行处理方法,有点像c的逻辑思路 4 开发成本比java小,但是语言学习成本比java高很多 正在阅读这本书的过程中,只能一点一点说。 第一部分快要读完了,习题也快要做完了。 1 第一部分主要着墨点正是回答我上述问题的1,2,3的。很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时也解释了为什么在scala中,val和var的区分为什么那么重要。 3 在做习题的过程中,尤其是在做类型推导的过程中,对原来oop,命令式编程函数式编程转变有很大作用;而且简洁的语法,确实让人有享受编程的感觉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng872347348

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值