【问题标题】:Sort list of String based on it's value in given map根据给定地图中的值对字符串列表进行排序
【发布时间】:2021-01-17 17:50:27
【问题描述】:

我有一个字符串列表

val str = List("A","B","C","D")

并给出:

val map = Map(("A"->3),("B"->1),("C"->10),("D"->5))

要根据给定的地图值对 str 列表进行排序,我尝试了str.sortBy(map)。它给了我错误"A" key is not found。有人可以帮我看看我做错了什么吗?

【问题讨论】:

  • 按原样工作。
  • 您可能希望使用getOrElse 来为缺少的键提供默认值。

标签: scala


【解决方案1】:

它应该可以正常工作。让我们解释一下原因。 sortBy的签名是:

def sortBy[B](f: A => B)(implicit ord: Ordering[B]): C = sorted(ord on f)

因此,当您执行str.sortBy(map) 时,sortBy 期望得到String => Int。 str.sortBy(map) 相当于:

str.sortBy(s => map(s))

请注意Map extends MapOps(在 Scala 2.13 中,在 Scala 2.12 中为 MapLike)。 MapOps(和MapLike) 公开了一个apply 方法,它采用(在你的情况下)String 并返回Int:

def apply(key: K): V = get(key) match {
  case None => default(key)
  case Some(value) => value
}

因此写str.sortBy(map) 等同于:

str.sortBy(s => map.apply(s))

等同于:

str.sortBy(map.apply)

代码在Scastie 运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2015-04-18
    • 1970-01-01
    • 2021-07-20
    • 2018-02-23
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多