2012-05-12 9 views

Respuesta

94

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.

+8

También vale la pena decir que para probar la existencia de una clave, el la biblioteca proporciona myMap.contains ("fish") –

+2

@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. –

8

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.

5

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

'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')'!) –

14

¿Desea saber si el valor existe en el mapa, o la clave? Si desea comprobar la clave, utilizar isDefinedAt:

myMap isDefinedAt key 
0

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

Cuestiones relacionadas