2011-01-25 176 views
23

我怎么排序地图这样的:斯卡拉地图排序

"01" -> List(34,12,14,23), "11" -> List(22,11,34) 

由年初值?

+0

您是否需要将结果作为另一张地图,或者您是否只希望在用于排序时忘记密钥? – 2011-01-25 12:42:13

+0

我需要结果在另一张地图。 – 2011-01-25 12:42:54

回答

57

一种方法是使用scala.collection.immutable.TreeMap,它总是通过关键字排序:

val t = TreeMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

//If you have already a map... 
val m = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
//... use this 
val t = TreeMap(m.toSeq:_*) 

你可以将其转换为一个序列或列表和排序它,太:

//by specifying an element for sorting 
m.toSeq.sortBy(_._1) //sort by comparing keys 
m.toSeq.sortBy(_._2) //sort by comparing values 

//by providing a sort function 
m.toSeq.sortWith(_._1 < _._1) //sort by comparing keys 

有很多的可能性,每种方式在某种情况下或多或少方便。

15

如前所述,默认Map类型是无序的,但总有SortedMap

import collection.immutable.SortedMap 
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 

虽然我猜你不能使用,因为我认识到这一点功课,并怀疑您的地图是结果的一组操作。所以,你必须创建一个空的SortedMap,并添加值:

val unsorted = Map("01" -> List(34,12,14,23), "11" -> List(22,11,34)) 
val sorted = SortedMap.empty[String, List[Int]] ++ unsorted 
//or 
val sorted = SortedMap(unsorted.toSeq:_*) 

或者,如果你不拘泥于Map界面,你可以将其转换为一个元组的序列。请注意,只有在键和值都具有定义的顺序时,此方法才有效。列表没有定义默认顺序,所以这不适用于您的示例代码 - 我因此改为创建其他数字。

val unsorted = Map("01" -> 56, "11" -> 34) 
val sorted = unsorted.toSeq.sorted 

,如果你可以先转换您的列表,以一些其他类型(如字符串),这是最好的使用mapValues

更新完成,这可能是有用的:见Landei的答案,它展示了如何你可以提供一个定制的排序功能,使这种方法的工作。