Scala里面的排序函数的使用
排序方法在实际的应用场景中非常常见,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里面的排序函数的使用的更多相关文章
- Scala List的排序函数sortWith
//原始方法: //val list=List("abc","bcd","cde") scala> list.sortWith( (s ...
- SQL中几个常用的排序函数
最近使用窗口函数的频率越来越高,这里打算简单介绍一下几个排序的函数,做一个引子希望以后这方面的问题能够更深入的理解,这里先简单介绍一下几个简单的排序函数及其相关子句,这里先从什么是排序开始吧 ...
- Sql Server系列:排序函数
在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...
- [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)
python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...
- SQL Server排序函数row_number和rank的区别
SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...
- php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)
测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...
- oracle 分组排序函数
项目开发中,我们有时会碰到需要分组排序来解决问题的情况:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示例和 ...
- Scala 流程空间,函数,异常处理
1,)首先留意一下下边的代码块,他是怎么运行的,貌似在c#中他是出错的,不应该出现这样的写法的,但在scala中侧不然: package com.dt.study /** * The package ...
- oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
随机推荐
- 使用CIFAR-10样本数据集测试卷积神经网络(ConvolutionalNeuralNetwork,CNN)
第一次将例程跑起来了,有些兴趣. 参考的是如下URL: http://www.yidianzixun.com/article/0KNz7OX1 本来是比较Keras和Tensorflow的,我现在的水 ...
- gradle 构建scala程序
一.build.gradle 二.gradle build ===================== 执行scala scala main.scala
- 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 ...
- onclick与click的区别
用法: Obj.click(function(){ }); Obj.onclick=function(){ } 相同:效果一样. 区别: 用户或浏览器执行的某种动作,例如click load,mous ...
- C++中得sort函数的比较函数(第三个参数)为什么要声明为static
sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中 ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net
SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...
- Hibernate框架的查询方式
技术分析之Hibernate框架的查询方式 1. 唯一标识OID的检索方式 * session.get(对象.class,OID) 2. 对象的导航的方式 ...
- python是什么编程语言。
python是一门动态解释性的强类型定义语言.
- 堆优化Prim 最小生成树 模板
#include <bits/stdc++.h> using namespace std; const int MAXN = 5005; const int MAXM = 200005; ...
- 模拟赛 提米树 题解 (DP+思维)
题意: 有一棵棵提米树,满足这样的性质: 每个点上长了一定数量的Temmie 薄片,薄片数量记为这个点的权值,这些点被标记为 1 到 n 的整数,其 中 1 号点是树的根,没有孩子的点是树上的叶子. ...