Come verificare se la chiave o il valore esistono in Map?


87

Ho una mappa in scala e vorrei verificare se esiste un certo valore nella mappa.

myMap.exists( /*What should go here*/ )

Risposte:


141

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.


13
Vale anche la pena dire che per verificare l'esistenza di una chiave, la libreria fornisce myMap.contains ("fish")
Dave Griffith

2
@DaveGriffith - Infatti. Stavo solo usando "esiste", ma quello è abbastanza importante (dato che è quello che dovresti usare) da aggiungere. Ho modificato la risposta di conseguenza.
Rex Kerr

25

Vuoi sapere se il valore esiste sulla mappa o la chiave? Se vuoi controllare la chiave, usa isDefinedAt:

myMap isDefinedAt key

9

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.


6

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

2
valuescrea un nuovo Iterablequindi probabilmente stai meglio con map.valuesIterator.contains('c')(anche se non è così facile map.exists(_._2 == 'c')!)
Luigi Plinge

3

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.