Sorting Scala地图排序

Sorting Scala地图排序,sorting,scala,map,Sorting,Scala,Map,如何对此类地图进行排序: "01" -> List(34,12,14,23), "11" -> List(22,11,34) 按起始值?一种方法是使用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" -

如何对此类地图进行排序:

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

按起始值?

一种方法是使用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:_*)
您也可以将其转换为Seq或List并对其进行排序:

//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
//通过指定用于排序的元素
m、 toSeq.sortBy(u._1)//通过比较键进行排序
m、 toSeq.sortBy(u._2)//通过比较值进行排序
//通过提供排序功能
m、 toSeq.sortWith(u.\u 1

有很多种可能性,在特定的上下文中,每种都或多或少地方便。

如前所述,默认的
映射类型是未排序的,但总是有
已排序的Map

import collection.immutable.SortedMap
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))
虽然我猜你不能用这个,因为我认识这个家庭作业并且怀疑你的地图是groupBy操作的结果。因此,您必须创建一个空的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的答案,该答案显示了如何提供自定义排序功能,使此方法能够工作。

是否需要将结果作为另一个映射,或者你只是想在键被用于排序后忘记它们吗?我需要另一个映射。我认为映射是未按定义排序的,不是吗?对不起,我不知道映射的定义,我需要按排序的方式;)您还可以将任意排序的序列附加到
LinkedHashMap
,这将保留遍历的插入顺序。嘿嘿,刚刚更新了我的答案以使用
。toseq:*
,没有发现您已经这样做了!承诺我没有偷窃:)阅读Kevin的答案,使用SortedMap似乎是更好的方式,因为它清楚地显示了您需要什么行为,而不是什么实现。@Raphael根据合同——它扩展了SortedMap表达式:*在树映射中的意思是什么(m.toSeq:*)?我没办法弄到