94

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

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

5 回答 5

150

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

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

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")最终会更短,但稍长的形式更明确地说明了您想要发生的事情。

于 2012-05-13T04:39:22.257 回答
29

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

myMap isDefinedAt key
于 2012-05-14T02:33:18.427 回答
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 提到方法“测试一个谓词是否适用于这个不可变映射的某些元素。”,关键是它接收一个元组(键,值)而不是两个参数。

于 2012-05-12T22:18:15.010 回答
7

那这个呢:

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

如果maptrue包含c值,则产生。

如果您坚持使用exists

map.exists({case(_, value) => value == 'c'})
于 2012-05-12T22:19:58.613 回答
3

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

于 2016-05-17T05:13:00.280 回答