J'ai une carte scala et je voudrais tester si une certaine valeur existe dans la carte.
myMap.exists( /*What should go here*/ )
Réponses:
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.
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
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.
Et ça:
val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c') //false
Rend true
si la carte contient une c
valeur.
Si vous insistez pour utiliser exists
:
map.exists({case(_, value) => value == 'c'})
values
crée un nouveau Iterable
donc vous êtes probablement mieux avec map.valuesIterator.contains('c')
(même si ce n'est pas aussi facile que map.exists(_._2 == 'c')
!)
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