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

Nab*_*egh 79 collections dictionary scala

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

myMap.exists( /*What should go here*/ )
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 128

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

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

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)
Run Code Online (Sandbox Code Playgroud)

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

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)
Run Code Online (Sandbox Code Playgroud)

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

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")
Run Code Online (Sandbox Code Playgroud)

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

  • 另外值得一提的是,为了测试密钥的存在,该库提供了myMap.contains("fish") (11认同)
  • @DaveGriffith - 的确如此.我只是使用"存在",但是那个很重要(因为它是你应该使用的那个)加入.我已经相应地修改了答案. (2认同)

Dan*_*ral 20

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

myMap isDefinedAt key
Run Code Online (Sandbox Code Playgroud)


ilc*_*ero 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
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*icz 6

那这个呢:

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

产量true如果地图包含c的价值.

如果你坚持使用exists:

map.exists({case(_, value) => value == 'c'})
Run Code Online (Sandbox Code Playgroud)

  • `values`创建了一个新的`Iterable`,所以你最好使用`map.valuesIterator.contains('c')`(尽管那不像`map.exists(_._ 2 =='c')那么简单. !) (2认同)

小智 6

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