【问题标题】:Scala map sortingScala 地图排序
【发布时间】:2011-06-15 04:13:27
【问题描述】:

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

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

按初始值?

【问题讨论】:

  • 您是否需要将结果作为另一个地图,或者您只是想忘记用于排序的键?
  • 我需要另一个地图的结果。
  • 我认为地图没有按定义排序,不是吗?
  • 对不起,我不知道地图的定义,我需要它以排序方式;)

标签: sorting scala map


【解决方案1】:

一种方法是使用 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

有很多可能性,每一种在特定情况下或多或少都很方便。

【讨论】:

  • 你也可以在LinkedHashMap后面追加一个任意排序的序列,这样会保留插入顺序进行遍历。
  • 呵呵,刚刚更新了我的答案以使用.toseq:_*,没有发现你已经这样做了!保证我不会偷东西:)
  • 阅读 Kevin 的回答,使用 SortedMap 似乎是更好的风格,因为它清楚地显示了您需要什么行为,而不是哪个实现。
  • @Raphael 根据合同——它扩展了 SortedMap
  • 表达式 :_* 在 TreeMap(m.toSeq:_*) 中是什么意思?我无法得到那个
【解决方案2】:

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

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 的回答,该回答展示了如何提供自定义排序功能以使这种方法发挥作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 2014-12-14
    • 1970-01-01
    • 2014-06-26
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多