【发布时间】:2018-02-27 15:57:19
【问题描述】:
我有一个矢量/地图列表 (Map[String,Int])。如何使用.find 查找映射列表中的这些映射之一中是否存在键值对?
【问题讨论】:
标签: scala functional-programming find scala-collections scalaz
我有一个矢量/地图列表 (Map[String,Int])。如何使用.find 查找映射列表中的这些映射之一中是否存在键值对?
【问题讨论】:
标签: scala functional-programming find scala-collections scalaz
val res = List(Map("1" -> 1), Map("2" -> 2)).find(t => t.exists(j => j == ("2", 2)))
println(res)
使用find 和exists 来检查它是否存在于地图中。
【讨论】:
== - @ "42" == 1234 在 REPL 上返回 res14: Boolean = false。
chengpohi 的解决方案效率很低,而且与我对问题的理解不同。
让m: Map[String,Int].
首先,使用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))
【讨论】:
甚至可以像这样使用我们感兴趣的键值来完成:
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>
【讨论】: