95 votes

Comment vérifier si la clé ou la valeur existe dans la carte ?

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

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

151voto

Rex Kerr Points 94401

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

Si vous entendez 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 juste 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 ex. _._1 == "fish" ) finissent par être plus courts, les formulaires légèrement plus longs sont plus explicites sur ce que vous voulez qu'il se passe.

29voto

Daniel C. Sobral Points 159554

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

myMap isDefinedAt key

9voto

ilcavero Points 1185

Vous fournissez un test que l'une des valeurs de la carte passera, 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 "Tests whether a predicate holds for some of the elements of this immutable map.", le problème est qu'elle reçoit un tuple (key, value) au lieu de deux paramètres.

7voto

Tomasz Nurkiewicz Points 140462

Qu'en est-il de ceci :

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

Rendement true si la carte contient c valeur.

Si vous insistez pour utiliser exists :

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

3voto

rpeleg Points 41

Selon les réponses ci-dessus, notez que exists() est significativement plus lent que contains() (j'ai fait un benchmark avec une Map contenant 5000 clés de chaînes, et le ratio était constamment de x100). Je suis relativement nouveau en Scala mais je pense que exists() itère sur toutes les clés (ou key,value tupple) alors que contains utilise l'accès aléatoire de Map.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X