【问题标题】:Compare scala map values to a list and return default value for keys that don't exist in the list将 scala 映射值与列表进行比较,并为列表中不存在的键返回默认值
【发布时间】:2020-05-08 23:56:54
【问题描述】:

我正在尝试将 Scala HashMap 的键与值列表进行比较,如果列表中不存在该键,我需要将 Map 的值更新为默认值 -1。

例如: 考虑以下情况:

列表:

val pos = List("100","110")

地图:

scala> idSizeMap
res2: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363, 120 -> 1825405636, 130 -> 2194234, 72 -> 3685020648)

使用 filterKeys 我可以进行交叉操作

scala> val result = idSizeMap.filterKeys(pos.contains)
result: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)

但相反,我还希望旧地图中的键具有默认值 -1。 预期输出:

Map(100 -> 4240070722, 110 -> 611884363, 120 -> -1, 130, -1, 72 -> -1)

我还尝试了以下操作,与 filterKeys 执行相同的操作:

var similarItems = Map[String, Long]()
similarItems: scala.collection.immutable.Map[String,Long] = Map()

scala> for (eachpos <- pos) {
     |   if (!eidSizeMap.contains(eachpos)) similarItems += (eachpos -> -1)
     |   else
     |   similarItems += (eachpos -> eidSizeMap(eachpos))
     | }

scala> similarItems
res8: scala.collection.immutable.Map[String,Long] = Map(100 -> 4240070722, 110 -> 611884363)

实现这一目标的最合适的 Scala 方式是什么?

【问题讨论】:

    标签: scala dictionary hadoop data-science


    【解决方案1】:

    考虑transform

    idSizeMap.transform((k, v) => if (pos.contains(k)) v else -1)
    

    可能会稍微短一些,因为键没有被转换。

    【讨论】:

      【解决方案2】:

      您可以只map 每个条目,如果键不在pos 中,则将值替换为默认值:

      idSizeMap.map{ case (k, v) => k -> (if (pos.contains(k)) v else -1) }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多