Ho una mappa in scala e vorrei verificare se esiste un certo valore nella mappa.
myMap.exists( /*What should go here*/ )
Risposte:
Ci sono diverse opzioni, a seconda di cosa intendi.
Se intendi per coppia chiave-valore "valore" , puoi utilizzare qualcosa di simile
myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)
Se intendi il valore della coppia chiave-valore , puoi farlo
myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)
Se vuoi testare solo la chiave della coppia chiave-valore , allora
myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")
Si noti che sebbene le forme della tupla (ad esempio _._1 == "fish") finiscano per essere più brevi, le forme leggermente più lunghe sono più esplicite su ciò che si vuole che accada.
Vuoi sapere se il valore esiste sulla mappa o la chiave? Se vuoi controllare la chiave, usa isDefinedAt:
myMap isDefinedAt key
fornisci un test che uno dei valori della mappa supererà, ad es
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
Gli ScalaDoc affermano che il metodo "Verifica se un predicato vale per alcuni degli elementi di questa mappa immutabile.", Il problema è che riceve una tupla (chiave, valore) invece di due parametri.
Che dire di questo:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Resa truese la mappa contiene un cvalore.
Se insisti a usare exists:
map.exists({case(_, value) => value == 'c'})
valuescrea un nuovo Iterablequindi probabilmente stai meglio con map.valuesIterator.contains('c')(anche se non è così facile map.exists(_._2 == 'c')!)
Per le risposte precedenti, nota che exist () è significativamente più lento di contains () (ho confrontato con una mappa contenente 5000 chiavi di stringa e il rapporto era un x100 coerente). Sono relativamente nuovo a scala ma la mia ipotesi esiste () sta iterando su tutte le chiavi (o chiave, valore tupple) mentre contiene utilizza l'accesso casuale di Map