实现
首先给一个不可变的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)
你可以按照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):_*)
上面是使用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)
上面所有的例子,都不是使用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)
讨论与思考:
对于一个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: _*)
尝试创建ListMap不使用上面方式
ListMap(x)
另外一种方式, 自定义函数,使用可变参数,_*它是如何使用的。下面printAll ,需要一个参数,和一个可变参数的String类型。
def printAll(strings: String*) { strings.foreach(println) }
你可以创建list如下
上面我们使用printAll(fruits)出错,我们可以这样使用
printAll(fruits: _*)
排序性能
额外补充他们的排序性.这里就不在过多说明,可参考下图