Scala的map实现key和value排序及各种排序比较等知识讨论

简介: Scala的map实现key和value排序及各种排序比较等知识讨论

实现



首先给一个不可变的map


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)

1f6b06e46bce2c77cd41cbc00477028f.jpg

你可以按照value排序,从高到低,使用sortBy



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> ListMap(grades.toSeq.sortBy(_._1):_*)

19ebae693b1e4fa6e8981795eecff9e8.jpg

上面是使用sortBy,下面我们使用sortWith


从低到高排序


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> ListMap(grades.toSeq.sortWith(_._2>_._2):_*)
res3: scala.collection.immutable.ListMap[String,Int] = Map(Melissa -> 95, Hannah
 -> 92, Emily -> 91, kim -> 90, Al -> 85)


6b86b0cd7302edb9c2dd79831c5c8371.jpg

上面所有的例子,都不是使用map直接排序,而是使用sort函数,结果在一个新的已经排序的map中,输出结果需要一个新的变量。

因此你可以使用ListMap 或则LinkedHashMap ,下面使用的是LinkedHashMap .


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)

d6f7aecc130ae1d352b1044b954dcdd9.jpg

讨论与思考:



对于一个map


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


grades.toSeq

因为map没有排序函数,所以我们转换序列后,可以使用排序函数


grades.toSeq.sortBy(_._2)



grades.toSeq.sortWith(_._2 < _._2)


数据排序后,会存储在ListMap 中


ListMap(grades.toSeq.sortBy(_._2):_*)


LinkedHashMap 也存储排序后的数据,如下


import scala.collection.mutable.LinkedHashMap



LinkedHashMap(grades.toSeq.sortBy(_._2):_*)


有可变和不可变的listMap版本,LinkedHashMap 只是一个可变的类,是比较好的解决方案。


关于排序函数中 _*的含义



整体来说,他可以代表多个参数,详细可参考下面说明

_*他可以传递或则代表多个参数,比如 ListMap 或则LinkedHashMap. 你不能直接初始化ListMap 使用tuples序列,但是apply 方法在伴生对象接受Tuple2 变参数,可以使用x和它一起,如下面例子


scala> ListMap(x: _*)

f2fe193f9f4f073d4012753f22784380.jpg

尝试创建ListMap不使用上面方式


ListMap(x)

6ab64056b49634dbc19819ff9977a8c4.jpg

另外一种方式, 自定义函数,使用可变参数,_*它是如何使用的。下面printAll ,需要一个参数,和一个可变参数的String类型。


def printAll(strings: String*) {
    strings.foreach(println)
}

你可以创建list如下

218439acb314c683aa8ab4d29419f878.jpg

上面我们使用printAll(fruits)出错,我们可以这样使用

printAll(fruits: _*)

ed5feda8755c0b32afb7319900e31fb3.jpg排序性能



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

3bc6dac06c4cfaf3417e7368ee837100.jpg

目录
相关文章
|
1月前
|
存储 Java API
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
40 1
|
2月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
23 0
|
6月前
|
存储 Java API
探讨Java中交换Map的Key和Value值的技术
探讨Java中交换Map的Key和Value值的技术
54 2
|
6月前
|
存储 缓存 Java
Java交换map的key和value值
在Java中,直接交换`Map`的key和value是不允许的,因为key是唯一的且不可变。不过,可以通过创建新`Map`实现交换:将原`Map`的value作为新key,key作为新value。注意,如果原`Map`有重复value或null,需额外处理。以下是一个代码示例,展示了如何在value唯一且非null的情况下交换`Map`的key和value。对于重复value或null值的情况,可以使用`List`存储多个key或忽略null值。在实际应用中,`Map`常用于缓存、配置管理、数据库结果映射等多种场景。
81 1
|
7月前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
282 0
|
6月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
3月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
3月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
4月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
4月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。