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


Answers:


141

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

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

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")最终变短了,但是稍长的形式对要发生的事情更加明确。


13
同样值得一提的是,为了测试密钥是否存在,该库提供了myMap.contains(“ fish”)
Dave Griffith

2
@DaveGriffith-的确如此。我只是在使用“存在”,但是添加它已经足够重要了(因为它是您应该使用的那个)。我相应地修改了答案。
雷克斯·克尔


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说方法“测试谓词是否对该不可变映射的某些元素成立。”的陷阱是,它接收一个元组(键,值)而不是两个参数。


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'})

2
values创建一个新的,Iterable所以您可能会更好map.valuesIterator.contains('c')(尽管这并不容易map.exists(_._2 == 'c')!)
Luigi Plinge 2012年

3

根据上面的答案,请注意,exist()的速度明显比contains()的速度慢(我已使用包含5000个字符串键的Map进行了基准测试,该比率是一致的x100)。我对scala相对较新,但是我的猜测是exist()遍历所有键(或键,值tupple),而contains使用Map的随机访问

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.