如何从scala中的地图中删除键值
Posted
技术标签:
【中文标题】如何从scala中的地图中删除键值【英文标题】:how to remove key value from map in scala 【发布时间】:2014-03-24 05:09:24 【问题描述】:Map(data -> "sumi", rel -> 2, privacy -> 0, status -> 1,name->"govind singh")
如果隐私为 0,如何从此地图中删除数据。
Map(rel -> 2, privacy -> 0, status -> 1,name->"govind singh")
【问题讨论】:
【参考方案1】: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)
【讨论】:
【参考方案2】:如果您希望扩大规模并移除多个成员,那么filterKeys
是您的最佳选择:
val a = Map(
"data" -> "sumi",
"rel" -> "2",
"privacy" -> "0",
"status" -> "1",
"name" -> "govind singh"
)
val b = a.filterKeys(_ != "data")
【讨论】:
这保留了对过滤收集的引用,不允许它被垃圾收集。 基于@St.Antario 的评论,filterKeys
导致地图无法序列化。因此,如果您正在过滤您计划用作 Spark Broadcast
的地图,则此方法将不起作用。在这些情况下,您最好使用以下内容:valuesToRemove.foldLeft(theMap) (filteredMap, valueToRemove) => filteredMap - valueToRemove
【参考方案3】:
这取决于您使用的 Scala.collection Map 的类型。 Scala 带有 mutable
和 immutable
映射。检查这些链接:
http://www.scala-lang.org/api/2.10.2/index.html#scala.collection.immutable.Map
和
http://www.scala-lang.org/api/2.10.2/index.html#scala.collection.mutable.Map
在这两种类型的映射中,-
通常是删除键的操作。详细信息取决于地图的类型。可以使用-=
就地修改mutable
映射。类似的东西
if (m.contains("privacy") && m.getOrElse("privacy", 1) == 0)
m -= "play"
另一方面,不可变映射不能原地修改,必须在删除元素后返回新映射。
if (m.contains("privacy") && m.getOrElse("privacy", 1) == 0)
val newM = m - "play"
请注意,您正在创建一个新的不可变映射。
【讨论】:
【参考方案4】:如果你使用不可变映射,你可以使用-
方法创建一个没有给定键的新映射:
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。没有错误。以上是关于如何从scala中的地图中删除键值的主要内容,如果未能解决你的问题,请参考以下文章