Scala的map实现key和value排序及各种排序比较等知识讨论
问题导读 1.map能否直接排序? 2.如何转换,才能排序? 3.排序结果可以存储在哪两个集合中? 4._*如何使用? 5.排序函数中,哪个可以进行升序和降序排列? 6.他们的排序性能如何? 如过想要对一个map排序,该如何实现。 首先给一个不可变的map
[Scala] 纯文本查看 复制代码
?
scala> val grades = Map("Kim" -> 90,
| "Al" -> 85,
| "Melissa" -> 95,
| "Emily" -> 91,
| "Hannah" -> 92
| )
grades: scala.collection.immutable.Map[String,Int] = Map(Hannah -> 92, Melissa -> 95, Kim -> 90, Emily -> 91, Al -> 85)
你可以按照value排序,从高到低,使用sortBy
[Scala] 纯文本查看 复制代码
?
scala> import scala.collection.immutable.ListMap
import scala.collection.immutable.ListMap
scala> ListMap(grades.toSeq.sortBy(_._2):_*)
res0: scala.collection.immutable.ListMap[String,Int] = Map(Al -> 85, Emily -> 91, Hannah -> 92, Kim -> 90, Melissa -> 95)
当然你也可以按照名字排序,也就是key排序,但是key排序显然作用不大。
[Scala] 纯文本查看 复制代码
?
scala> ListMap(grades.toSeq.sortBy(_._1):_*)
上面是使用sortBy,下面我们使用sortWith 从低到高排序
[Scala] 纯文本查看 复制代码
?
scala> ListMap(grades.toSeq.sortWith(_._2<_._2):_*)
res2: scala.collection.immutable.ListMap[String,Int] = Map(Al -> 85, kim -> 90,
Emily -> 91, Hannah -> 92, Melissa -> 95)
从高到低排序
[Scala] 纯文本查看 复制代码
?
scala> ListMap(grades.toSeq.sortWith(_._2>_._2):_*)
res3: scala.collection.immutable.ListMap[String,Int] = Map(Melissa -> 95, Hannah
-> 92, Emily -> 91, kim -> 90, Al -> 85)
上面所有的例子,都不是使用map直接排序,而是使用sort函数,结果在一个新的已经排序的map中,输出结果需要一个新的变量。 因此你可以使用ListMap 或则LinkedHashMap ,下面使用的是LinkedHashMap .
[Scala] 纯文本查看 复制代码
?
scala> val x=collection.mutable.LinkedHashMap(grades.toSeq.sortBy(_._2):_*)
x: scala.collection.mutable.LinkedHashMap[String,Int] = Map(Al -> 85, kim -> 90,
Emily -> 91, Hannah -> 92, Melissa -> 95)
scala> x.foreach(println)
(Al,85)
(kim,90)
(Emily,91)
(Hannah,92)
(Melissa,95)
讨论与思考: 对于一个map
[Scala] 纯文本查看 复制代码
?
scala> val grades = Map("Kim" -> 90,
| "Al" -> 85,
| "Melissa" -> 95,
| "Emily" -> 91,
| "Hannah" -> 92
| )
grades: scala.collection.immutable.Map[String,Int] = Map(Hannah -> 92, Melissa -> 95, Kim -> 90, Emily -> 91, Al -> 85)
我们为什么要把他转换为序列toSeq
[Scala] 纯文本查看 复制代码
?
grades.toSeq
因为map没有排序函数,所以我们转换序列后,可以使用排序函数
[Scala] 纯文本查看 复制代码
?
grades.toSeq.sortBy(_._2)
[Scala] 纯文本查看 复制代码
?
grades.toSeq.sortWith(_._2 < _._2)
数据排序后,会存储在ListMap 中
[Scala] 纯文本查看 复制代码
?
ListMap(grades.toSeq.sortBy(_._2):_*)
LinkedHashMap 也存储排序后的数据,如下
[Scala] 纯文本查看 复制代码
?
import scala.collection.mutable.LinkedHashMap
[Scala] 纯文本查看 复制代码
?
LinkedHashMap(grades.toSeq.sortBy(_._2):_*)
有可变和不可变的listMap版本,LinkedHashMap 只是一个可变的类,是比较好的解决方案。 关于排序函数中 _*的含义 整体来说,他可以代表多个参数,详细可参考下面说明 _*他可以传递或则代表多个参数,比如 ListMap 或则LinkedHashMap. 你不能直接初始化ListMap 使用tuples序列,但是apply 方法在伴生对象接受Tuple2 变参数,可以使用x和它一起,如下面例子
[Scala] 纯文本查看 复制代码
?
scala> ListMap(x: _*)
尝试创建ListMap不使用上面方式
[Scala] 纯文本查看 复制代码
?
ListMap(x)
另外一种方式, 自定义函数,使用可变参数,_*它是如何使用的。下面printAll ,需要一个参数,和一个可变参数的String类型。
[Scala] 纯文本查看 复制代码
?
def printAll(strings: String*) {
strings.foreach(println)
}
你可以创建list如下
上面我们使用printAll(fruits)出错,我们可以这样使用
[Scala] 纯文本查看 复制代码
?
printAll(fruits: _*)
排序性能 额外补充他们的排序性.这里就不在过多说明,可参考下图
- QT中根据ID设置radio按钮
- QWebView在 Qt 5.x中编译出错:File not found: main.obj
- Qt实现小功能之列表无限加载
- Python基础08 面向对象的基本概念
- 如何选择合适的PaaS
- 使用Qt installer framework制作安装包
- Qt Style Sheet实践(三):QCheckBox和QRadioButton
- 堆排序
- 剑指OFFER之旋转数组的最小数字(九度OJ1386)
- Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
- 剑指OFFER之旋转数组的最小数字(九度OJ1386)
- Qt Style Sheet实践(二):组合框QComboBox的定制
- Python基础07 函数
- 剑指OFFER之旋转数组的最小数字(九度OJ1386)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- InnoDB Tidbit:The doublewrite buffer wastes 32 pages (512 KiB) (12.双写缓冲区会导致512KB的浪费)
- 10 | Tornado源码分析:Gen 对象(上)
- springboot使用spring-cloud-starter-alibaba-sentinel导致响应变成xml格式
- 内网安全攻防之内网渗透测试基础
- CMake脚本中如何修改XCode工程属性?
- 数值微分|有限差分法的误差分析
- Odyssey
- 【MySQL】之join算法详解
- 性能最佳实践:查询模式和分析
- Node 如何在 Controller 层进行数据校验
- FlutterDojo设计之道——状态管理之路(二)
- EyouCms前台GetShell漏洞复现
- CentOS7系统使用rpm方式安装MySQL5.7
- Mysql的主从复制
- 初学者指南:什么是算法?11行伪代码给你讲明白