专栏首页about云Scala的map实现key和value排序及各种排序比较等知识讨论

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: _*)

排序性能 额外补充他们的排序性.这里就不在过多说明,可参考下图

本文分享自微信公众号 - about云(wwwaboutyuncom),作者:pig2

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 适合小白入门Spark的全面教程

    1.实时分析 在我们开始之前,让我们来看看美国社交媒体比较有名的企业每分钟产生的数据量。

    用户1410343
  • 王联辉:Spark在腾讯应用及对企业spark使用指导

    问题导读 1.腾讯如何使用Spark 技术的?带来了哪些好处? 2.Spark 技术最适用于哪些应用场景? 3.企业在应用Spark 技术时,需要做哪些改变吗...

    用户1410343
  • Spark利用Project Tungsten将硬件性能提升到极限

    我们将为你介绍性能提升的下一阶段——Tungsten。在2014年,我们目睹了Spark缔造大规模排序的新世界纪录,同时也看到了Spark整个引擎的大幅度提升—...

    用户1410343
  • 腾讯入股合作金融云,花费4亿元获长亮科技7.14%股份

    此前,有消息称,腾讯拟入股长亮科技。这一消息最终被证实,腾讯花费4亿元获得长亮科技7.14%股份。未来,双方将联合打造金融云产品,推出云+端整体解决方案。

    CloudBest
  • 10X Genomics单细胞免疫组库VDJ分析必知必会

    我们生活着的世界并非只有我们自己,而是有很多小于或大于我们的生物不断与我们交互着,有的让我们开心,有的使我们伤心。这就关系到一个本质的问题:

    生信技能树jimmy
  • bat脚本简化操作

    一些常用的操作可以封装成脚本,将excel文件转json文件,策划更新配置文件后,需要给客户端导表,hhh感觉我又在干运维的活。

    深雾
  • Spark UDF小结

    Spark UDF 增加了对 DS 数据结构的操作灵活性,但是使用不当会抵消Spark底层优化。

    mikeLiu
  • 【MySQL】数据库闪回工具之binlo

    py3study
  • mysql之基本语法

    本篇将主要集中在mysql的使用上,包括如何创建标,如何进行insert,update,select,delete,以及一些常见的sql中关键字的使用姿势

    一灰灰blog
  • LeetCode 311. 稀疏矩阵的乘法

    给你两个 稀疏矩阵 A 和 B,请你返回 AB 的结果。 你可以默认 A 的列数等于 B 的行数。

    Michael阿明

扫码关注云+社区

领取腾讯云代金券