¿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*/ )

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.


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

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.


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.