web-dev-qa-db-fra.com

Comment vérifier si une clé ou une valeur existe dans Map?

J'ai un scala Map) et voudrais tester si une certaine valeur existe dans la carte.

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

Il y a plusieurs options différentes, en fonction de ce que vous voulez dire.

Si vous voulez dire par "valeur" paire clé-valeur, alors vous pouvez utiliser quelque chose comme

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)

Si vous voulez dire valeur de la paire clé-valeur, alors vous pouvez

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)

Si vous vouliez simplement tester la clé de la paire clé-valeur, alors

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")

Notez que bien que les formes de tuple (par exemple, _._1 == "fish") finissent par être plus courts, les formes légèrement plus longues sont plus explicites sur ce que vous voulez que se passe.

127
Rex Kerr

Voulez-vous savoir si la valeur existe sur la carte ou sur la clé? Si vous voulez vérifier la clé, utilisez isDefinedAt:

myMap isDefinedAt key
19
Daniel C. Sobral

vous fournissez un test indiquant que l'une des valeurs de la carte va passer, c'est-à-dire.

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

Les ScalaDocs disent de la méthode "Teste si un prédicat est valable pour certains des éléments de cette carte immuable.".

9
ilcavero

Et ça:

val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c')  //false

Rend true si la carte contient la valeur c.

Si vous insistez pour utiliser exists:

map.exists({case(_, value) => value == 'c'})
6

Selon les réponses ci-dessus, notez que exist () est nettement plus lent que conte () (j'ai déjà comparé avec une carte contenant 5 000 clés de chaîne et le rapport était un x100 cohérent). Je suis relativement nouveau sur scala mais je suppose qu'il existe () itère sur toutes les clés (ou la clé, la valeur tupple) alors qu'il contient utilise l'accès aléatoire de Map

2
rpeleg