【问题标题】:Finding a map in list/vector of maps in Scala在 Scala 中的地图列表/向量中查找地图
【发布时间】:2018-02-27 15:57:19
【问题描述】:

我有一个矢量/地图列表 (Map[String,Int])。如何使用.find 查找映射列表中的这些映射之一中是否存在键值对?

【问题讨论】:

    标签: scala functional-programming find scala-collections scalaz


    【解决方案1】:
    val res = List(Map("1" -> 1), Map("2" -> 2)).find(t => t.exists(j => j == ("2", 2)))
    println(res)
    

    使用findexists 来检查它是否存在于地图中。

    【讨论】:

    • 我建议您使用=== 作为一个小的改进,以提高类型安全性。不惜一切代价避免 == - @ "42" == 1234 在 REPL 上返回 res14: Boolean = false
    【解决方案2】:

    chengpohi 的解决方案效率很低,而且与我对问题的理解不同。

    m: Map[String,Int].

    为什么chengpoi的解决方案效率低下

    首先,使用m.exists(j => j == ("2",2)),也可以写成m.contains("2" -> 2)查看m的每个条目,而m("2").toSeq.contains(2)只执行一次映射查找。 请注意,m.contains("2" -> 2) 将不起作用,因为 contains 会覆盖 Map 以检查密钥,即 m.contains("2") 有效,而且速度也很快。

    要获得与 chengpoi 相同的结果,但高效:

    def mapExists[K,V](ms: List[Map[K,V]], k: K, v: V): Option[(K,V)] = 
        ms.get(k).filter(_ == v).map(_ => k -> v)
    

    请注意,此方法返回其参数,这是相当多余的。

    我如何理解这个问题

    其次,我将问题理解为检查 List 是否包含带有特定对的 Map。 这将转化为

    def mapExists[K,V](ms: List[Map[K,V]], k: K, v: V): Boolean = 
        ms.exists(_.get(k).contains(v))
    

    【讨论】:

      【解决方案3】:

      甚至可以像这样使用我们感兴趣的键值来完成:

      scala> val res = List(Map("A" -> 10), Map("B" -> 20)).find(_.keySet.contains("B"))
      res: Option[scala.collection.immutable.Map[String,Int]] = Some(Map(B -> 20))
      
      scala>
      

      【讨论】:

        猜你喜欢
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2012-05-23
        • 1970-01-01
        • 2017-07-30
        • 2020-09-09
        • 2012-03-11
        相关资源
        最近更新 更多