【问题标题】:how to remove key value from map in scala如何从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")  

【问题讨论】:

    标签: scala dictionary collections playframework scala-collections


    【解决方案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 带有 mutableimmutable 映射。检查这些链接:

      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。没有错误。
        猜你喜欢
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 2022-01-11
        • 2014-09-30
        相关资源
        最近更新 更多