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 true
se la mappa contiene un c
valore.
Se insisti a usare exists
:
map.exists({case(_, value) => value == 'c'})
values
crea un nuovo Iterable
quindi 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