Scala地图排序

Adr*_*ski 24 sorting scala map

如何对这种地图进行排序:

"01" -> List(34,12,14,23), "11" -> List(22,11,34)
Run Code Online (Sandbox Code Playgroud)

由初值?

Lan*_*dei 61

一种方法是使用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:_*)
Run Code Online (Sandbox Code Playgroud)

您也可以将其转换为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
Run Code Online (Sandbox Code Playgroud)

有很多可能性,在某些情况下或多或少都很方便.


Kev*_*ght 16

如上所述,默认Map类型是未排序的,但始终存在SortedMap

import collection.immutable.SortedMap
SortedMap("01" -> List(34,12,14,23), "11" -> List(22,11,34))
Run Code Online (Sandbox Code Playgroud)

虽然我猜你不能使用它,因为我认识到这个功课并怀疑你的地图是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:_*)
Run Code Online (Sandbox Code Playgroud)

或者,如果您不熟悉Map界面,则可以将其转换为一系列元组.请注意,只有在键和值都具有已定义的顺序时,此方法才有效.列表没有定义默认顺序,因此这不适用于您的示例代码 - 因此我编写了一些其他数字.

val unsorted = Map("01" -> 56, "11" -> 34)
val sorted = unsorted.toSeq.sorted
Run Code Online (Sandbox Code Playgroud)

如果您可以先将列表转换为其他类型(如String),这可能很有用,最好使用 mapValues

更新: 请参阅Landei的答案,其中显示了如何提供自定义排序功能,以使此方法有效.