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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏二进制文集

Thrift 对象序列化、反序列化-字节数组分析

本篇博客仅分析Thrift对象的序列化、反序列化的字节数组,以及Thrift对象的序列化、反序列化原理。其他源码分析会另开章节~

25620
来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第五章 Kotlin面向对象编程(OOP)一个OOP版本的HelloWorld构造函数传参Data Class定义接口&实现之写pojo bean定一个Rectangle对象封

We frequently create a class to do nothing but hold data. In such a class some s...

25540
来自专栏HansBug's Lab

3097: Hash Killer I

3097: Hash Killer I Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special Judge Su...

24040
来自专栏Golang语言社区

实效go编程--2

Go函数的返回值或结果“形参”可被命名,并作为常规变量使用,就像传入的形参一样。 命名后,一旦该函数开始执行,它们就会被初始化为与其类型相应的零值; 若该函数执...

35070
来自专栏chenssy

【死磕 Spring】—– IOC 之构造函数实例化 bean

createBeanInstance() 用于实例化 bean,它会根据不同情况选择不同的实例化策略来完成 bean 的初始化,主要包括:

14840
来自专栏mathor

二分查找与二分答案(3)

17240
来自专栏友弟技术工作室

golang之Struct什么是结构体struct?

最近在复习golang,学习的东西,如果不使用,很快就会忘记。所以,准备复习完golang,做一个练手的小项目,加深对golang的学习。今天开始公司,进入封闭...

60960
来自专栏SeanCheney的专栏

《Pandas Cookbook》第01章 Pandas基础

公司网址,http://www.dunderdata.com(dunder是蒸馏朗姆酒的残留液体,取这个名字是类比数据分析过程) GitHub地址:https...

16920
来自专栏jeremy的技术点滴

py3_cookbook_notes_01

34380
来自专栏数据结构与算法

codevs 1213 解的个数

1213 解的个数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知整数x...

34240

扫码关注云+社区

领取腾讯云代金券