如何检查Map中是不是存在键或值?

Posted

技术标签:

【中文标题】如何检查Map中是不是存在键或值?【英文标题】:How to check whether key or value exist in Map?如何检查Map中是否存在键或值? 【发布时间】:2012-05-21 00:25:02 【问题描述】:

我有一个 scala 地图,想测试地图中是否存在某个值。

myMap.exists( /*What should go here*/ )

【问题讨论】:

【参考方案1】:

您提供一个地图值将通过的测试,即

val mymap = Map(9->"lolo", 7->"lala")
mymap.exists(_._1 == 7) //true
mymap.exists(x => x._1 == 7 && x._2 == "lolo") //false
mymap.exists(x => x._1 == 7 && x._2 == "lala") //true

ScalaDocs 提到方法“测试一个谓词是否适用于这个不可变映射的某些元素。”,问题是它接收一个元组(键,值)而不是两个参数。

【讨论】:

【参考方案2】:

这个呢:

val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c')  //false

如果地图包含 c 值,则返回 true

如果你坚持使用exists

map.exists(case(_, value) => value == 'c')

【讨论】:

values 会创建一个新的Iterable,因此您可能最好使用map.valuesIterator.contains('c')(尽管这不像map.exists(_._2 == 'c') 那样简单!)【参考方案3】:

有几种不同的选项,具体取决于您的意思。

如果你的意思是“值”键值对,那么你可以使用类似的东西

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)

如果你的意思是键值对的值,那么你可以

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)

如果你只想测试键值对的键,那么

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")

请注意,尽管元组形式(例如 _._1 == "fish")最终会更短,但稍长的形式更明确地表明了您想要发生的事情。

【讨论】:

另外值得一提的是,为了测试密钥的存在,库提供了 myMap.contains("fish") @DaveGriffith - 确实。我只是在使用“存在”,但那个足够重要(因为它是您应该使用的)可以添加。我已经相应地修改了答案。【参考方案4】:

您想知道 value 是否存在于地图上,还是存在于 key 上?如果要检查密钥,请使用isDefinedAt

myMap isDefinedAt key

【讨论】:

【参考方案5】:

根据上面的答案,请注意 exists() 比 contains() 慢得多(我使用包含 5000 个字符串键的 Map 进行了基准测试,比率是一致的 x100)。我对 scala 比较陌生,但我的猜测是 exists() 正在遍历所有键(或键、值元组),而 contains 使用 Map 的随机访问

【讨论】:

以上是关于如何检查Map中是不是存在键或值?的主要内容,如果未能解决你的问题,请参考以下文章

查找数组的嵌套对象中是不是存在键或值

如何从 json 列中获取键或值数据

如何在迭代值之前检查 jq 中是不是存在“键”

Spring data redis - 如何使用 hashOperation 的 scan 方法根据模式获取键或值?

检查 Presto 值映射中是不是存在键

JS基础 Map是一组键值对的结构