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

时间:2012-05-12 22:07:09

标签: scala dictionary collections

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

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

5 个答案:

答案 0 :(得分:120)

根据您的意思,有几种不同的选择。

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

的内容
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")最终会缩短,但稍长一些的表单会更清楚地显示您想要发生的事情。

答案 1 :(得分:19)

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

myMap isDefinedAt key

答案 2 :(得分:9)

你提供一个测试,其中一个地图值将通过,即

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说方法“测试谓词是否适用于这个不可变映射的某些元素。”,问题是它接收一个元组(键,值)而不是两个参数。

答案 3 :(得分:6)

这个怎么样:

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

如果地图包含true值,则收益c

如果您坚持使用exists

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

答案 4 :(得分:1)

根据上面的答案,请注意,exists()明显慢于contains()(我使用包含5000个字符串键的Map进行基准测试,并且比率是一致的x100)。我对scala比较新,但我的猜测是存在()迭代所有键(或键,值tupple),而contains包含使用Map的随机访问