专栏名称: About云
about云-为热爱云开发技术人员提供最全面的信息传播和服务平台
目录
相关文章推荐
财宝宝  ·  如果还不起月供了怎么办? ... ·  22 小时前  
龚新宇看楼市  ·  在郊区工作,应该买哪里自住? ·  3 天前  
51好读  ›  专栏  ›  About云

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

About云  · 公众号  ·  · 2017-10-24 18:14

正文

问题导读

1.map能否直接排序?
2.如何转换,才能排序?
3.排序结果可以存储在哪两个集合中?
4._*如何使用?
5.排序函数中,哪个可以进行升序和降序排列?
6.他们的排序性能如何?





如过想要对一个map排序,该如何实现。

首先给一个不可变的map

[Scala] 纯文本查看 复制代码

?

1
2
3
4
5
6
7
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] 纯文本查看 复制代码

?

1
2
3
4
5
scala> import scala.collection.immutable.ListMap
import scala.collection.immutable.ListMap
scala> ListMap(grades.toSeq.sortBy( _ . _ 2 ) :_ *)
res 0 : scala.collection.immutable.ListMap[String,Int] = Map(Al -> 85 , Emily -> 91 , Hannah -> 92 , Kim -> 90 , Melissa -> 95 )



当然你也可以按照名字排序,也就是key排序,但是key排序显然作用不大。

[Scala] 纯文本查看 复制代码

?

1
scala> ListMap(grades.toSeq.sortBy( _ . _ 1 ) :_ *)




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

从低到高排序

[Scala] 纯文本查看 复制代码

?

1
2
3
scala> ListMap(grades.toSeq.sortWith( _ . _ 2 < _ . _ 2 ) :_ *)
res 2 : scala.collection.immutable.ListMap[String,Int] = Map(Al -> 85 , kim -> 90 ,
Emily -> 91 , Hannah -> 92 , Melissa -> 95 )



从高到低排序

[Scala] 纯文本查看 复制代码

?

1
2
3
scala> ListMap(grades.toSeq.sortWith( _ . _ 2 > _ . _ 2 ) :_ *)
res 3 : scala.collection.immutable.ListMap[String,Int] = Map(Melissa -> 95 , Hannah
-> 92 , Emily -> 91 , kim -> 90 , Al -> 85 )






上面所有的例子,都不是使用map直接排序,而是使用sort函数,结果在一个新的已经排序的map中,输出结果需要一个新的变量。
因此你可以使用ListMap 或则LinkedHashMap ,下面使用的是LinkedHashMap .

[Scala] 纯文本查看 复制代码

?

01
02
03
04
05
06
07
08
09
10
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] 纯文本查看 复制代码

?

1
2
3
4
5
6
7
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] 纯文本查看 复制代码

?

1
grades.toSeq


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

[Scala] 纯文本查看 复制代码

?

1






请到「今天看啥」查看全文