Tengo un mapa scala y me gustaría probar si existe un cierto valor en el mapa.
myMap.exists( /*What should go here*/ )
Respuestas:
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.
¿Quieres saber si el valor existe en el mapa o la clave? Si desea verificar la clave, use isDefinedAt
:
myMap isDefinedAt key
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.
¿Qué pasa con esto?
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Rinde true
si el mapa contiene c
valor.
Si insiste en usar exists
:
map.exists({case(_, value) => value == 'c'})
values
crea una nueva, Iterable
por lo que probablemente esté mejor con map.valuesIterator.contains('c')
(¡aunque eso no es tan fácil como map.exists(_._2 == 'c')
!)
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