dictionary—将scalaMap值与列表进行比较,并为列表中不存在的键返回默认值

lymgl2op  于 2021-05-27  发布在  Hadoop
关注(0)|答案(2)|浏览(522)

我试图将scala hashmap的键与值列表进行比较,如果该键不在列表中,我需要将该Map的值更新为默认值-1。
例如:考虑以下情况:
列表:

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

Map:

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)

但是我也希望旧Map中的键具有默认值-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方式来实现这一点?

1tuwyuhd

1tuwyuhd1#

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

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

fv2wmkja2#

你可以 map 如果密钥不在 pos 将该值替换为默认值:

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

相关问题