问题导读
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]
纯文本查看
复制代码
?
因为map没有排序函数,所以我们转换序列后,可以使用排序函数
[Scala]
纯文本查看
复制代码
?