Tengo un mapa de scala y me gustaría probar si existe un cierto valor en el mapa.¿Cómo verificar si la clave o el valor existen en el Mapa?
myMap.exists(/*What should go here*/)
Tengo un mapa de scala y me gustaría probar si existe un cierto valor en el mapa.¿Cómo verificar si la clave o el valor existen en el Mapa?
myMap.exists(/*What should go here*/)
Hay varias opciones diferentes, dependiendo de lo que quiere decir.
Si quieres decir con "valor" par clave-valor, entonces se puede usar algo como
myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)
Si se refiere a valor del par clave-valor, entonces se puede
myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)
Si quería probar simplemente 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 (p. Ej. _._1 == "fish"
) terminan siendo más cortos, las formas un poco más largas son más explícitas sobre lo que quiere que suceda.
que proporcionan una prueba de que uno de los valores de mapa pasará, 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 del método "Prueba si un predicado es válido para algunos de los elementos de este mapa inmutable. ", la pega es que recibe una tupla (clave, valor) en lugar de dos parámetros.
Qué tal esto:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Rendimientos true
si mapa contiene c
valor.
Si usted insiste en el uso de exists
:
map.exists({case(_, value) => value == 'c'})
'values' crea un nuevo' Iterable' por lo que probablemente estés mejor con 'map.valuesIterator.contains ('c')' (aunque eso no es tan fácil como 'map.exists (_._ 2 == 'c')'!) –
¿Desea saber si el valor existe en el mapa, o la clave? Si desea comprobar la clave, utilizar isDefinedAt
:
myMap isDefinedAt key
por respuestas anteriores, nota que existe() es significativamente más lento que contiene() (He Benchmarked con un mapa que contiene claves de las cadenas 5000, y la proporción fue un x100 consistente). Soy relativamente nuevo en scala, pero creo que existe() itera sobre todas las claves (o key, value tupple) mientras que contiene el acceso aleatorio de Map
También vale la pena decir que para probar la existencia de una clave, el la biblioteca proporciona myMap.contains ("fish") –
@DaveGriffith - De hecho. Solo estaba usando "existe", pero esa es lo suficientemente importante (ya que es la que debe usar) para agregar. He modificado la respuesta en consecuencia. –