排序方法在实际的应用场景中非常常见,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),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
“里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。” ——Chris Nauroth, Hortonworks “边干边学,而非只是阅读。” ——Douglas Alan、Eli和Edythe L. Broad,哈佛和麻省理工学院
Scala中集合的使用 大学生 1. List 列表的使用 2. Set 集合的使用 3.Map 映射的使用 4. 元组的使用
详细讲解Scala中的高阶函数部分,具体实例剖析Scala中高阶函数的意义所在,对控制抽象进行了详细的说明,参考书籍《快学Scala》、《Programming in Scala》
英文原版 scala函数式编程 function programming in scala
Scala与Clojure函数式编程 Functional.Programming.Patterns.in.Scala.and.Clojure
函数式编程(FP)是一种...《Scala函数式编程》是针对希望学习FP并将它应用于日常编码中的程序员而写的,内容包括:函数式编程的概念;函数式编程相关的各种“为什么”和“怎么做”;如何编写多核程序;练习和检测。
本文详细的介绍了scala的函数,对于入门者来说是一个很好的启蒙教材
目前很多大数据组件都是用scala开发,包括Spark, Kafka, Flink,scala的函数式编程思想能够带来比java更高的效率,同时其可读性及难度升高,文档由浅入深介绍Scala的语法、特性等;
Scala中的函数式特征与并发.pdf
主要介绍了scala集合和函数的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
Scala.Rx 是一个 Scala 的函数式反应编程的库,基于 FRP 和 Deprecating the Observer Pattern 理论的实现. 简单例子: import rx._ val a = Var(1); val b = Var(2) val c = Rx{ a() b() } println(c()) // 3 a...
Scala 函数嵌套我们可以在 Scala 函数内定义函数,定义在函数内的函数称之为局部函数。
Scala函数式编
最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
函数式编程是从编程方式(范式)的角度来谈的,可以这样理解:函数式编程把函数当作一等公民,充分利用函数、只是函数的多种使用方式,在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将...
第5讲-Scala编程详解:函数入门 共5页 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页 第7讲-Scala编程详解:函数入门之变长参数 共4页 第8讲-Scala编程详解:函数入门之过程、lazy值和异常 共5页 第9讲-...
基于最新的scala-mongo-driver使用scala操作mongo数据库,不是mongo-java-driver,网上很多教程都是基于java的不是mongo的,研究两天才知道咋用,一起学习哇