¿Cómo comprobar si existe una clave o un valor en el mapa?

87

Tengo un mapa scala y me gustaría probar si existe un cierto valor en el mapa.

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

Respuestas:

141

Hay varias opciones diferentes, según lo que quiera decir.

Si se refiere al par clave-valor "valor" , puede usar algo como

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

Si se refiere al valor del par clave-valor , puede

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

Si solo desea probar la clave del par clave-valor , entonces

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

Tenga en cuenta que aunque las formas de tupla (por ejemplo _._1 == "fish") terminan siendo más cortas, las formas ligeramente más largas son más explícitas sobre lo que desea que suceda.

Rex Kerr
fuente
13
También vale la pena decir que para probar la existencia de una clave, la biblioteca proporciona myMap.contains ("pescado")
Dave Griffith
2
@DaveGriffith - De hecho. Solo estaba usando "existe", pero ese es lo suficientemente importante (ya que es el que debe usar) para agregarlo. He modificado la respuesta en consecuencia.
Rex Kerr
25

¿Quieres saber si el valor existe en el mapa o la clave? Si desea verificar la clave, use isDefinedAt:

myMap isDefinedAt key
Daniel C. Sobral
fuente
9

proporciona una prueba de que pasará uno de los valores del mapa, es decir

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

Los ScalaDocs dicen sobre el método "Prueba si un predicado es válido para algunos de los elementos de este mapa inmutable", el problema es que recibe una tupla (clave, valor) en lugar de dos parámetros.

ilcavero
fuente
6

¿Qué pasa con esto?

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

Rinde truesi el mapa contiene cvalor.

Si insiste en usar exists:

map.exists({case(_, value) => value == 'c'})
Tomasz Nurkiewicz
fuente
2
valuescrea una nueva, Iterablepor lo que probablemente esté mejor con map.valuesIterator.contains('c')(¡aunque eso no es tan fácil como map.exists(_._2 == 'c')!)
Luigi Plinge
3

De acuerdo con las respuestas anteriores, tenga en cuenta que existe () es significativamente más lento que contiene () (lo comparé con un mapa que contiene 5000 claves de cadena, y la proporción fue constante x100). Soy relativamente nuevo en scala, pero supongo que existe () está iterando sobre todas las claves (o clave, valor tupple) mientras que contiene utiliza el acceso aleatorio de Map

rpeleg
fuente