À l'aide de la fonction rechercher pour les cartes en scala
Je suis en train d'essayer de trouver une clé dans une Carte, donné une valeur. Je suis l'aide de la "trouver" de la fonction par pas en mesure de comprendre le droit de prédicat:
val colors = Map(1 -> "red", 2 -> "blue")
def keyForValue(map: Map[Int, String], value: String) = {
val bool = map.find{map.foreach{map.values(i) == value}}
bool.key
}
Comment puis-je effectuer une itération sur la carte et de trouver la clé quand je sais la valeur?
OriginalL'auteur Core_Dumped | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Vous utilisez le même type de prédicat avec un
List
, mais gardez à l'esprit que vous êtes de les évaluer sur(key,value)
paires, au lieu de simplement les valeurs (et d'obtenir une paire retour!).Exemple Simple:
Je suppose que de l'accepter, que vous avez probablement déjà compris, mais juste au cas où: si vous exécutez le code tel qu'il est réellement dans la réponse, vous obtiendrez la clé. C'est ce que
.getOrElse(default)._1
est pour. Il extrait la valeur de laOption
vous obtenez à partir defind
, par défaut, et avec_1
vous obtenez le premier élément de la paire, qui se trouve être la clé dans le cas de cartes.OriginalL'auteur mikołak
La signature de
find
dansMap
estfind(p: ((A, B)) ⇒ Boolean): Option[(A, B)]
. Ainsi, le prédicat prend unTuple2
et doit retourner uneBoolean
. Remarque j'ai changévalue
à unInt
depuis la clé danscolors
est aussi unInt
.Test:
Vous pouvez également utiliser
get
:OriginalL'auteur Brian
Vous pouvez toujours aller avec la solution abstraite et échanger les clés de leurs valeurs, de le stocker dans une nouvelle carte, et ensuite, la recherche de la nouvelle carte:
La troisième ligne de swaps sur les touches avec leurs valeurs, et les stocke dans
revMap
. (map map
signifie que le nom de la carte, dans ce cas, le paramètre de la carte, puis le mot de la carte, puis{_.swap}
à fait permuter les touches avec leurs valeurs.OriginalL'auteur kungfushark
Je voudrais éviter de passer la carte à la méthode find, et plutôt ne laisser passer que la carte est clés à la méthode find.
Cela évite de traiter avec une Option[Int,String] -- au lieu de cela, il est Option[Int].
Cela donne:
OriginalL'auteur warrens