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

87

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

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

Réponses:

141

Il existe plusieurs options différentes, selon ce que vous voulez dire.

Si vous entendez par paire clé-valeur "valeur" , vous pouvez utiliser quelque chose comme

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

Si vous voulez dire la valeur de la paire clé-valeur , 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 courtes, les formes légèrement plus longues sont plus explicites sur ce que vous voulez qu'il se passe.

Rex Kerr
la source
13
Il convient également de dire que pour tester l'existence d'une clé, la bibliothèque fournit myMap.contains ("fish")
Dave Griffith
2
@DaveGriffith - En effet. J'utilisais juste «existe», mais celui-ci est assez important (puisque c'est celui que vous devriez utiliser) pour être ajouté. J'ai modifié la réponse en conséquence.
Rex Kerr
25

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

myMap isDefinedAt key
Daniel C. Sobral
la source
9

vous fournissez un test que l'une des valeurs de la carte réussira, c.-à-

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.", Le problème est qu'il reçoit un tuple (clé, valeur) au lieu de deux paramètres.

ilcavero
la source
6

Et ça:

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

Rend truesi la carte contient une cvaleur.

Si vous insistez pour utiliser exists:

map.exists({case(_, value) => value == 'c'})
Tomasz Nurkiewicz
la source
2
valuescrée un nouveau Iterabledonc vous êtes probablement mieux avec map.valuesIterator.contains('c')(même si ce n'est pas aussi facile que map.exists(_._2 == 'c')!)
Luigi Plinge
3

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

rpeleg
la source