如何在Scala中从Map中删除键值对

47
Map(data -> "sumi", rel -> 2, privacy -> 0, status -> 1,name->"govind singh")

如果隐私为0,如何从这张地图中删除数据。

Map(rel -> 2, privacy -> 0, status -> 1,name->"govind singh")  
4个回答

68
如果你使用不可变的map,你可以使用-方法来创建一个没有给定键的新map:
val mx = Map("data" -> "sumi", "rel" -> 2, "privacy" -> 0)

val m = mx("privacy") match {
    case 0 => mx - "data"
    case _ => mx
}

=> m: scala.collection.immutable.Map[String,Any] = Map(rel -> 2, privacy -> 0)
如果您使用可变映射,您可以使用-=remove来删除一个键。

你不必在这里使用模式匹配,因为如果从现有的Map中删除的键不存在,它将返回相同的Map。 没有错误。 - Arpit Suthar

26

如果您希望将其扩展并删除多个成员,则filterKeys是最佳选择:

val a = Map(
  "data"    -> "sumi",
  "rel"     -> "2",
  "privacy" -> "0",
  "status"  -> "1",
  "name"    -> "govind singh"
)

val b = a.filterKeys(_ != "data")

这会保留对过滤集合的引用,不允许其被垃圾回收。 - St.Antario
1
在@St.Antario的评论基础上,filterKeys会生成一个无法序列化的映射。因此,如果您要过滤一个计划用作Spark Broadcast的映射,则此方法将不起作用。在这些情况下,最好使用以下方法:valuesToRemove.foldLeft(theMap) { (filteredMap, valueToRemove) => filteredMap - valueToRemove } - Cities

11
这取决于您使用的Scala.collection Map类型。Scala提供了mutableimmutable Maps两种。请查看以下链接:http://www.scala-lang.org/api/2.10.2/index.html#scala.collection.immutable.Maphttp://www.scala-lang.org/api/2.10.2/index.html#scala.collection.mutable.Map
在这两种类型的映射中,-通常是删除键的操作。细节取决于Map的类型。可以使用-=来就地修改mutable map。类似这样:
if (m.contains("privacy") && m.getOrElse("privacy", 1) == 0) {
    m -= "play"
}

另一方面,不可变映射无法就地修改,必须在删除元素后返回新映射。

if (m.contains("privacy") && m.getOrElse("privacy", 1) == 0) {
    val newM = m - "play"
}

请注意,您正在创建一个新的不可变映射。


0
val m = Map("data" -> "sumi", "rel" -> 2, "privacy" -> 0,"status" -> 1,"name"->"govind singh")
scala> if(m("privacy")==0) m.filterKeys(_ != "data")
res63: Any = Map(name -> govind singh, rel -> 2, privacy -> 0, status -> 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接